思路:我们考虑一个子串s,如果s不是个回文串,那么就不用考虑在a+s+a是不是回文串了,直接break;
另一个要注意的点是:起始中心子串有两种长度:1个或者2个---------------看了leetcode官方题解,这个应该是中心扩展法。
class Solution {
public:
string longestPalindrome(string s) {
int N = s.length();
int start=0;
int end = 0;
for (int i = 0; i < N-1; i++) {
if (s[i] == s[i + 1]) {
start = i;
end = i + 1;
}
}
for (int i = 1; i < N-1; i++) {
for (int j = 1; i-j>=0 && i+j<N ; j++) {
if (s[i - j] == s[i + j]) {
if (2 * j > end - start) {
start = i - j;
end = i + j;
}
}
else
break;
}
}
for (int i = 1; i < N - 2; i++) {
if (s[i]!=s[i+1])
continue;
for (int j = 1; i - j >= 0 && i + j<N; j++) {
if (s[i - j] == s[i + j + 1]) {
if (2 * j + 1 > end - start) {
start = i - j;
end = i + j + 1;
}
}
else
break;
}
}
return s.substr(start,end-start+1);
}
};
官方题解提到了manacher解法,但是没有具体讲怎么做的。
这个链接讲的挺好的,马拉车算法漫画对白讲解版 自己去打开看看,关注下公众号