class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param A string字符串
* @return int整型
*/
int getLongestPalindrome(string A) {
// write code here
// Manacher 算法
string t = "$#"; // 初始化新字符串,添加特殊字符避免边界检查
for (char c : A) {
t += c;
t += '#';
}
t += '@'; // 结尾添加特殊字符
int n = t.length();
vector<int> p(n, 0);
int c = 0, r = 0; // 当前回文串中心和右边界
int maxLen = 0;
for (int i = 1; i < n - 1; ++i) {
p[i] = (r > i) ? min(r - i, p[2 * c - i]) : 0; // 初始扩展半径
// 尝试扩展回文串
while (t[i + 1 + p[i]] == t[i - 1 - p[i]]) {
p[i]++;
}
// 更新中心和右边界
if (i + p[i] > r) {
c = i;
r = i + p[i];
}
maxLen = max(maxLen, p[i]);
}
return maxLen;
}
};