题目描述:
此题算是一个比较经典的问题了,做法有很多,比如暴力 动态规划 manacher算法,这里采用著名的manacher算法,算法时间复杂度为o(n),算法思想感觉和kmp有相似之处,此链接有详细介绍:点击打开链接
其中,要注意几个重要的变量的含义,id:当前中心点
p[id]:回文串长度的一半(包括id本身)
mx:回文串的右边界(id当前回文串右边紧邻的第一个节点)
代码如下:
class Solution {
public:
string longestPalindrome(string s) {
string t = "@#";//@防止访问越界,你换成其他的也行,只要不在字符串中出现
int i;
for(i = 0 ;i < s.size() ;i++){
t += s[i];
t += '#';
}
int p[t.size()] = {0};
int id = 0,mx = 0,maxlens = 0,ans = 0;
for(i = 1;i < t.size() ;i++){
p[i] = i < mx ?min(p[id*2 - i],mx - i) : 1;
while(t[i - p[i]] == t[i + p[i]]) p[i] ++;
if(mx < i + p[i]){
mx = i + p[i];
id = i;
}
if (p[i] > maxlens){
maxlens = p[i];
ans = i;
}
}
return s.substr((ans - maxlens) /2,maxlens - 1);//i还要换算成在原本字符串中的下标
}
};