5. 最長回文子串
給定一個字元串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入: “babad”
輸出: “bab”
注意: “aba” 也是一個有效答案。
示例 2:
輸入: “cbbd”
輸出: “bb”
提示:
-
1 <= s.length <= 1000
-
僅由數字和英文字母(大寫和/或小寫)組成s
- 我的解題
class Solution {
public:
string longestPalindrome(string s) {
int Maxlen, begin;
int oddMax, odd_begin;
int evenMax, even_begin;
odd_fine(s, oddMax, odd_begin);
even_find(s, evenMax, even_begin);
if(s.length() == 1){
return s.substr(0, 1);
}
if(oddMax > evenMax){
Maxlen = oddMax;
begin = odd_begin;
}
else{
Maxlen = evenMax;
begin = even_begin;
}
return s.substr(begin, Maxlen);
}
void odd_fine(string s, int &Maxlen, int &begin){
int i, j, k;
int slen, len;
slen = s.length();
Maxlen = 1;
begin = 1;
for(i = 1; (slen-i)*2+1 > Maxlen && i < slen - 1; i++){
for(j = i+1, k=i-1; j < slen && k > -1; j++, k--){
if(s[j] == s[k]){
len = j - k + 1;
if(len > Maxlen){
Maxlen = len;
begin = k;
}
}
else{
break;
}
}
}
}
void even_find(string s, int &Maxlen, int &begin){
int i, j, k;
int slen, len;
slen = s.length();
Maxlen = 1;
begin = 1;
for(i = 0; (slen-i-1)*2 > Maxlen && i < slen - 1; i++){
for(j = i+1, k=i; j < slen && k > -1; j++, k--){
if(s[j] == s[k]){
len = j - k +1;
if(len > Maxlen){
Maxlen = len;
begin = k;
}
}
else{
break;
}
}
}
}
};