LeetCode 5. Longest Palindromic Substring
Manacher算法。时间复杂度O(N)。网上解释很多。
#define min(a, b) (a > b ? b : a)
class Solution {
public:
string longestPalindrome(string s) {
int length = s.size();
string s2(2*length +3,0);
vector<int> v(2 * length + 2,0);
s2[0] = '$';
s2[1] = '#';
for (size_t j = 0; j < length; j++){
s2[j*2+2] = s[j];
s2[j * 2 + 3] = '#';
}
s2[length * 2 + 2] = '^';
int mx = 0, cn = 0, maxl = 0;
for (int i = 1; s2[i] != '^'; ++i){
v[i] = mx > i ? min(v[cn * 2 - i], mx - i) : 1;
while (s2[i + v[i]] == s2[i - v[i]])
++v[i];
if (i + v[i] > mx){
cn = i;
mx = i + v[i];
}
if (v[i] > v[maxl])
maxl = i;
}
return s.substr((maxl- v[maxl])/2, v[maxl]-1);
}
};