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"
.
class Solution {
public:
bool isPalindrome(string s, int start, int end)
{
while(start<end)
{
if(s[start] != s[end]) return false;
start++; end--;
}
return true;
}
string shortestPalindrome(string s) {
int pos = s.length()-1;
if(pos==0) return s;
for(; pos>0; pos--)
if(s[pos]==s[0] && isPalindrome(s, 0, pos)) break;
string res;
for(int i = s.length()-1; i > pos; i--)
res.push_back(s[i]);
res+=s;
return res;
}
};
这种方法时间复杂度O(n2),提交超时。而求最长回文的manacher算法时间复杂度是O(n)。
class Solution {
public:
int longestPalindrom(string s) {
string s1;
s1.resize(2 * s.length() + 2);
int idx = 0;
s1[idx++] = '$';
s1[idx++] = '#';
for (char a : s) {
s1[idx++] = a;
s1[idx++] = '#';
}
vector<int> p(s1.length(), 0);
int res = 0;
for (int id = 0, i = 1; i < s1.length(); ++i) {
if (i < id + p[id]) p[i] = min(p[2 * id - i], id + p[id] - i);
else p[i] = 1;
while (s1[i + p[i]] == s1[i - p[i]]) ++p[i];
if (id + p[id] < i + p[i]) id = i;
if (p[i] == i) res = max(res, i);
}
return res - 1;
}
string shortestPalindrome(string s) {
int pos = longestPalindrom(s);
string res;
for (int i = s.length() - 1; i >= pos; --i) res.push_back(s[i]);
return res + s;
}
};