题意:给定一个字符串,在字符串的前面加一些字符,使之成为回文串。返回最短长度的回文串。
解法:一开始看成在字符的每个字母前都可以加了,我说怎么做不出来,看解法有感觉跟我理解的不一样,还以为是解法错了,没想到是我错了。
思路就是看看字符串从0开始最长的回文串是多少,假设s[0~i]是以s[0]开头的最长的回文串,那么要加的字符串为s[i+1~l]的逆序。问题就转换为如何去发现从s[0]开始的最长回文串?
方法一:枚举。这个就不说了,网上有人说java能过,反正我写C会超时。刷题不是为了过,而是为了找更好的方法。好吧,这显然不是最好的方法。
方法二:反转字符串+KMP。设s的反转串为s',先求出s#s'#的next数组,然后最长的长度就是最后一个#的next值。具体为什么我就不说了,网上讲KMP算法的很多,我就不再赘述了。
代码如下:
string shortestPalindrome(string s)
{
int i,j,k,length=s.length();
int next[100000];
string ans="",temp;
if(length<=1) return s;
ans+=s;
ans+="-";
for(i=length-1;i>=0;i--) ans+=s[i];
ans+="-";
j=-1;
k=0;
next[0]=-1;
while(k<ans.length())
{
if(j==-1||ans[j]==ans[k])
{
j++;
k++;
next[k]=j;
}
else j=next[j];
}
k=next[ans.length()-1];
temp="";
for(i=length-1;i>=k;i--) temp+=s[i];
return temp+s;
}