5 最长回文子串
题目描述
题目给出的接口为:
class Solution {
public:
string longestPalindrome(string s) {
}
};
题目分析
定义两个变量 start 和end,分别表示最长回文子串的起点跟长度,在遍历s中的字符的时候,我们首先判断剩余的字符数是否小于等于end 的一半。
是的话表明就算从当前到末尾到子串是半个回文串,那么整个回文串长度最多也就是 end,既然 end 无法变长,计算就没有意义,直接在当前位置 break 。
否则就要继续判断,我们用两个变量left和right分别指向当前位置,然后我们先要做的是向右遍历跳过重复项,这个操作很必要,比如对于 noon这种,只有先跳过重复,此时left指向第一个o,right指向第二个o,然后再向两边扩散。而对于 bob这种,无法向右跳过重复,此时 left 和 right 同时指向o,再向两边扩散也是正确的,所以可以同时处理奇数和偶数的回文串,之后的操作就是更新 end 和 start 了。
代码如下:
class Solution {
public:
string longestPalindrome(string s) {
if(s.size() < 2) return s;
int n = s.size() , end = 0 , start = 0;
for(int i = 0 ; i < n ;)
{
if(n - 1 <= end / 2) break;
int left = i , right = i;
while(right < n - 1 && s[right + 1] == s[right]) ++ right;
i = right + 1;
while(right < n - 1 && left > 0 && s[right + 1] == s[left - 1]) {
++ right;
-- left;
}
if(end < right - left + 1)
{
end = right - left + 1;
start = left;
}
}
return s.substr(start , end);
}
};