用了Manacher算法,On复杂度
class Solution {
public:
string shortestPalindrome(string s) {
reverse(s.begin(),s.end());
string s2="$#";
for(auto& x:s)
s2 += x ,s2+='#';
s2+='@';
int id=0,mx=0;
vector<int> P(s2.size(),0);
for(int i=1;i<s2.size();++i){
if(mx>i) P[i]=min(P[2*id-i],mx-i);
else P[i]=1;
while(s2[i+P[i]]==s2[i-P[i]]) ++P[i];
if(mx<P[i]+i) mx=P[i]+i,id=i;
if(mx>=s2.size()-2) break;
}
string t=string(s,0,s.size()-(P[id]-1));
reverse(s.begin(),s.end());
return t+s;
}
};