Leetcode-5-最长回文串
题目链接
题目描述
求给出s中的最长回文串
思路
-
O(n^2)暴力,中心扩展。
-
manacher算法,O(n).
C++代码
class Solution {
public:
string longestPalindrome(string s)
{ // 只返回长度
if (s.length() == 0)
return 0;
// 预处理字符串
string s1 = "#", ans = "";
for (int i = 0; i < s.length(); i++)
s1 += s[i], s1 += "#";
int maxn = 0; // 最大回文半径长度。减一就是原字符串的最长回文串的长度。
int C = -1, R = -1; // 初始化 中心 和 最右边界
vector<int> rArr(s1.size()); // 回文半径 数组,长度包括中心
int len = s1.length();
int start, end; // 返回字符串时,标记回文串的 开始和结束
for (int i = 0; i < len; i++) {
rArr[i] = i < R ? min(rArr[2*C-i], R-i+1): 1; // 区分两种大情况
while (i+rArr[i] < len && i-rArr[i] > -1) { // 尝试进行扩展
if (s1[i+rArr[i]] == s1[i-rArr[i]])
rArr[i]++;
else
break;
}
if (i+rArr[i]-1 > R) { // 更新 最右边界 和 中心
R = i+rArr[i]-1;
C = i;
}
if (rArr[i] > maxn) { // 更新答案
maxn = rArr[i];
start = i-rArr[i]+1;
end = i+rArr[i]-1;
}
}
for (int i = start; i <= end; i++)
if (s1[i] != '#')
ans.push_back(s1[i]);
return ans;
}
};