Description
leetcode
一个字符串S,可以在前面添加一个字符串S’,使得S’S是最短的回文串。
例如
Given "aacecaaa", return "aaacecaaa".
Given "abcd", return "dcbabcd".
Solution
因为添加的字符只能放在前面,所以构成回文串的一定是S的某一后缀。所以是求前缀中最长的回文串。这个可以用KMP做,令T为S的倒,然后用S去匹配T,求匹配到T的末尾的最长长度,即为原串最长前缀回文串的长度。
附代码:
class Solution {
public:
string shortestPalindrome(string s) {
int n = s.size();
if (n == 0) return s;
string t = s;
reverse(t.begin(), t.end());
int f[n+1];
memset(f,0,sizeof(f));
for (int i = 1; i < n; ++i) {
int j = f[i];
while (j && s[i] != s[j]) j = f[j];
f[i+1] = s[i] == s[j] ? j+1 : 0;
}
int pos =0,j=0;
for (int i = 0; i < n; ++i) {
while (j && t[i] != s[j]) j = f[j];
if (t[i] == s[j]) {
++j;
}
}
if (j != 0) pos = j - 1;
t = s.substr(pos +1, n - 1 - pos);
reverse(t.begin(), t.end());
return t + s;
}
};