这题可以用KMP算法求解,如果大家不懂KMP可以先去看看KMP算法思路。
题目:
Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.
For example:
Given “aacecaaa”, return “aaacecaaa”.
Given “abcd”, return “dcbabcd”.
代码如下:
class Solution {
//KMP算法思路 以及 部分匹配表Table的求解方法。
public String shortestPalindrome(String s) {
if(s==null||s.length()==0||s.length()==1) return s;
StringBuilder sb=new StringBuilder(s);
//这里加#的原因是防止出现这种情况
//s="aaaaa" 如果没有#,这种情况会出错
String str=s+"#"+sb.reverse().toString();
int[] table=getTable(str);
int mpl=table[table.length-1];
sb=new StringBuilder(s.substring(mpl,s.length()));
return sb.reverse().toString()+s;
}
//得到Table表,KMP算法比较重要的一块就是求解Table数组。
public int[] getTable(String s){
int[] table=new int[s.length()];
int index=0;
for(int i=1;i<s.length();i++){
if(s.charAt(index)==s.charAt(i)){
table[i]=table[i-1]+1;
index++;
}else{
index=table[i-1];
while(index>0&&s.charAt(index)!=s.charAt(i))
index=table[index-1];
if(s.charAt(index)==s.charAt(i))
index++;
table[i]=index;
}
}
return table;
}
}