Shortest Palindrome
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”.
分析
We can construct the following string and run KMP algorithm on it: ST=(s) + (some symbol not present in s) + (reversed string).then we caculate next[j] value of ST.
时间复杂度O(n),空间复杂度O(n)。
class Solution {
public:
string shortestPalindrome(string s) {
string tmp=s;
int size = s.size();
reverse(tmp.begin(), tmp.end());
tmp = s + "#" + tmp;
vector<int> next(tmp.size()+1, 0);
KPM_nextJ(tmp, next);
return tmp.substr(size + 1, size - next[tmp.size()]) + s;
}
void KPM_nextJ(const string& str, vector<int>& next){
int j = 1, k = 0;
next[0] = -1;
next[1] = 0;
int size = str.size();
while (j < size){
if (str[j] == str[k]){
++k;
++j;
next[j] = k;
}
else if (k == 0){
++j;
next[j] = 0;
}
else
k = next[k];
}
}
};