题目:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
Manacher算法(O(n))
class Solution {
public:
string longestPalindrome(string s) {
if (s.size() <= 1) return s;
string aux;
aux.push_back('?');//s中不存在的字符,哨兵的作用
for (int ii = 0; ii < s.size(); ++ii){
aux.push_back(s[ii]);
aux.push_back('#');//s中不存在的字符
}
aux.pop_back();
aux.push_back('*');//s中不存在的字符,哨兵的作用
vector<int> rad(aux.size());//rad[i]表示以aux[i]为轴的回文的半径
int i = 1, j = 0;
while (i < aux.size()){
//得到以aux[i]为轴的回文的半径
while (aux[i - 1 - j] == aux[i + 1 + j])
++j;//j表示半径
rad[i] = j;
//得到以aux[i+k]为轴的半径(根据rad[i]和rad[i-k]),k的范围是1到j
int k = 1;
while (k <= j && rad[i] - k != rad[i - k]){
rad[i + k] = min(rad[i - k], rad[i] - k);
++k;
}
j = max(rad[i] - k, 0);//如果aux[i]-k == aux[i-k],rad[i+k]至少为rad[i]-k, 所以计算rad[i+k]的rad的时候探测rad[i]-k或更大即可;
i += k;//继续计算i+k及以后的字符为轴的回文半径rad
}
int maxPos = 1;
for (int i = 1; i < rad.size(); ++i){
if (rad[i] > rad[maxPos] || rad[i] == rad[maxPos] && aux[maxPos] != '#') maxPos = i;
}
string res;
for (int iii = maxPos - rad[maxPos]; iii <= maxPos + rad[maxPos]; ++iii){
if (aux[iii] != '#')
res.push_back(aux[iii]);
}
return res;
}
};