題目描述:
此題算是一個比較經典的問題了,做法有很多,比如暴力 動態規劃 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還要換算成在原本字符串中的下標
}
};