class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
// 预处理字符串
char* src = new char[len * 2 + 1];
src[0] = '#';
int i = 0;
int j = 2;
while(i < len){
src[j - 1] = s[i++];
src[j] = '#';
j += 2;
}
// manacher求p数组
len = len * 2 + 1;
int* p = new int[len];
int maxlen = 0, maxright = 0, pos = 0;
int maxpos = 0;
for (int i = 0; i < len; i++){
if (i < maxright)
p[i] = min(p[2 * pos - i], maxright - i);
else
p[i] = 1;
// 向2边扩展
while(i - p[i] >= 0 && i + p[i] < len && src[i - p[i]] == src[i + p[i]])
p[i]++;
// 更新maxright, pos
if (p[i] + i - 1 > maxright)
maxright = p[i] + i - 1, pos = i;
if (maxlen < p[i])
maxlen = p[i], maxpos = i;
}
// 利用已得的maxlen,maxright,pos计算最长回文串
cout << maxlen << " " << maxpos;
int left = i;
if (maxpos % 2 == 0)
left = (maxpos - 1) / 2 - (maxlen - 1) / 2 + 1;
else
left = maxpos / 2 - (maxlen - 1) / 2;
return s.substr(left, maxlen - 1);
}
};
LetCode 5. 最长回文子串
最新推荐文章于 2023-05-30 20:37:25 发布