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.
Example 1:
Input:"aacecaaa"
Output:"aaacecaaa"
Example 2:
Input:"abcd"
Output:"dcbabcd"
思路:
这道题如果我们直接用暴力求解的方法是不行的,会导致超时。
我们仔细分析这个问题会发现,其实我们只需要找到从字符串的头开始的最长回文就可以了,而如何找到最长的回文呢?这里可以用到经典的KMP算法,使我们的算法的时间复杂度降低为O(n)。代码如下:
class Solution {
public:
string shortestPalindrome(string s) {
string rev = s;
reverse(rev.begin(), rev.end());
string foo = s+"*"+rev;
vector<int> next(foo.size(), 0);
int t = next[0] = -1;
int j = 0;
while(j<int(foo.size()-1)){
if(0>t || foo[j] == foo[t]){
j++;t++;
next[j] = t;
}
else{
t = next[t];
}
}
return rev.substr(0, s.size() - next[foo.size()-1] -1)+s;
}
};