manacher 算法,寻找s[0..k]为回文串的最长回文串
class Solution {
public:
string shortestPalindrome(string s) {
string tmp="$#";
int n=s.size();
int i;
for(i=0;i<n;i++)
{
tmp+=s[i];
tmp+="#";
}
tmp+='0';
int m=tmp.size();
int p[m]={0};
int id=0;
int mx=0;
int mn=1;
for(i=1;i<m-1;i++)
{
if(mx>i)
p[i]=min(mx-i,p[2*id-i]);
else
p[i]=1;
while(tmp[i-p[i]]==tmp[i+p[i]])
{
p[i]++;
}
if(i+p[i]>mx)
{
id=i;
mx=i+p[i];
}
if(i-p[i]==0)
mn=p[i]-1;
}
tmp=s;
for(i=mn;i<n;i++)
{
tmp=s[i]+tmp;
}
return tmp;
}
};
方法2:
使用KMP
class Solution {
public:
string shortestPalindrome(string s) {
string s1 = s;
reverse(s1.begin(),s1.end());
s1 = s + "#" + s1; //防止匹配字符串的长度大雨s.size(),所以需要加‘#’
int n = s1.size(),i;
vector<int> nxt(n,0);
int k = 0;
for(i = 1;i < n;i++)
{
while(k > 0 && s1[i] != s1[k])
k = nxt[k-1];
if(s1[i] == s1[k])
k++;
nxt[i] = k;
}
s1 = s.substr(nxt[n-1]);
reverse(s1.begin(),s1.end());
return s1 + s;
}
};