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();
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。