给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
输入: "aacecaaa"
输出: "aaacecaaa"
示例 2:
输入: "abcd"
输出: "dcbabcd"
解法:KMP算法
假设添加的字符串为sadd,则sadd+s为回文字符串,s = shead + stail;stail = sadd。
查找最长回文前缀shead,匹配方式shead和s进行匹配
class Solution {
public String shortestPalindrome(String s) {
int n = s.length();
int[] next = new int[n];
Arrays.fill(next, -1);
for (int i = 1; i < n; i++) {
int j = next[i - 1];
while (j != -1 && s.charAt(j + 1) != s.charAt(i)) {
j = next[i];
}
if (s.charAt(j + 1) == s.charAt(i)) {
next[i] = j + 1;
}
}
int best = -1;
for (int i = n - 1; i >= 0; i--) {
while (best != -1 && s.charAt(best + 1) != s.charAt(i)) {
best = next[best];
}
if (s.charAt(best + 1) == s.charAt(i)) {
++best;
}
}
String add = (best == n-1 ? "" : s.substring(best + 1));
StringBuffer ans = new StringBuffer(add).reverse();
ans.append(s);
return ans.toString();
}
}