題目連接: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(); } }