//kmp
public String shortestPalindrome(String s){
String r = new StringBuilder(s).reverse().toString();
String t = s+"#"+r;
int[] next = new int[t.length()];
for(int i = 1; i < t.length() ; i++){
int j= next[i-1];//next[i-1]就是第i个字符能够匹配的最长的前缀的长度
while(j >0 && t.charAt(i)!=t.charAt(j)) j=next[j-1];//逐渐缩小匹配范围
j += (t.charAt(i)==t.charAt(j))?1:0;//最终还是要看最小范围中j和i匹配不匹配
next[i]=j;//next[j]表示包含j对应的字符在内的最长相同前后缀
}
return r.substring(0,s.length()-next[t.length()-1])+s;
}