题目连接:https://leetcode.com/problems...数组
找到string从头开始最长的palindrome substring:s[0:i+1]
那么只要把substring(i+1)
的reverse加到s前面就是结果了。
找palindrome substring的过程能够用kmp来作优化,因为reverse(s[0:i+1]) == s[0:i+1]
,那么就照着kmp里面见prefix数组的方法来查,最后prefix[n-1]
就是palindrome的长度,注意两个string并在一块儿的要加分隔符,防止算prefix的出问题。app
public class Solution { public String shortestPalindrome(String s) { StringBuilder rev = new StringBuilder(s).reverse(); String d = s + "#" + rev.toString(); int n = d.length(); int[] prefix = new int[n]; // i for rev, j for s int i = 1, j = 0; while(i < n) { // match if(d.charAt(j) == d.charAt(i)) { prefix[i] = j + 1; i++; j++; } else { if(j == 0) i++; else j = prefix[j-1]; } } StringBuilder sb = new StringBuilder(); sb.append(s.substring(prefix[n-1])); return sb.reverse().append(s).toString(); } }