class Solution {
public:
string append_string2(string s){
int l = s.length();
string res ="^";
for(int i=0; i<l; i++){
string tt = "#";
tt+=s[i];
res += tt;
}
res+="#";
return res;
}
string longestPalindrome(string s) {
string S = append_string2(s);
int N = S.length();
int* p = new int[N];
int c = 0;int r =0;
p[0]=0;
p[1]=0;
int max_i_flag = -1;
int max_p_flag = -1;
for(int i = 1; i < N-1;i++){
int i_mirror = (2*c - i);
if(i < r){
p[i] = min(r-i, p[i_mirror]);
}else{
p[i]=0;
}
while(S[i-1-p[i]] == S[i+1+p[i]]){
p[i]++;
}
if(p[i] + i > r){
r = p[i] + i;
c = i;
}
if(p[i] > max_p_flag){
max_p_flag = p[i];
max_i_flag = i;
}
}
int begin = (max_i_flag - max_p_flag) /2 ;
return s.substr(begin, max_p_flag);
}
};
核心是这个trick :不断地动态更新 当前最好的 “回文的中心点” 和 “回文半径”。