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; } };