214. Shortest Palindrome

214. Shortest Palindrome

題目連接: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();
    }
}
相關文章
相關標籤/搜索