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的出问题。

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();
    }
}

lulouch13
13 声望6 粉丝