http://www.jiuzhang.com/article/Google%202016%E5%B9%B412%E6%9C%88%20SDE%20Onsite%E9%9D%A2%E7%BB%8F/
https://leetcode.com/problems/shortest-palindrome/description/
Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.
For example:
Given "aacecaaa"
, return "aaacecaaa"
.
Given "abcd"
, return "dcbabcd"
.
Credits:
Special thanks to @ifanchu for adding this problem and creating all test cases. Thanks to @Freezen for additional test cases.
class Solution {
public String shortestPalindrome(String s) {
String sRev = (new StringBuffer(s)).reverse().toString();
String sNew = s + "*" + sRev;//*起到隔断作用,免得最长匹配串操作 s.length
int n = sNew.length();
int[] next = new int[n];
for(int i=1; i<n; i++) {//长度为i的串
int pre = next[i-1];
while(pre>0 && sNew.charAt(i)!=sNew.charAt(pre)) {
pre = next[pre-1];
}
next[i] = pre+(sNew.charAt(i)==sNew.charAt(pre)?1:0);
}
return sRev.substring(0, s.length()-next[n-1])+s;
}
}