给你一个字符串
s
,找到s
中最长的回文
子串
。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2:
输入:s = "cbbd" 输出:"bb"提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
还是学会了之前不会写的题,使用manacher算法,3ms打败99%。
radius数组采用不带中心的半径,这样方便一些。
string longestPalindrome(string s) {
int n = s.length(), max_r = -1, ctr = -1, res_r = -1, res_idx = -1;
int n2 = n * 2 + 1;
vector<int> radius;
string cpy;
for (int i = 0; i < n; i++) {
cpy.push_back('#');
cpy.push_back(s[i]);
}
cpy.push_back('#');
for (int i = 0; i < n2; i++) {
int cur_r = 0;
if (i > max_r) {
while (i - cur_r >= 0 && i + cur_r < n2 && cpy[i + cur_r] == cpy[i - cur_r]) cur_r++;
cur_r--;
}
else {
int corr_idx = ctr - (i - ctr);
if (corr_idx - radius[corr_idx] > ctr - (max_r - ctr)) {
cur_r = radius[corr_idx];
}
else if (corr_idx - radius[corr_idx] < ctr - (max_r - ctr)) {
cur_r = corr_idx - ( ctr - (max_r - ctr) );
}
else {
cur_r = radius[corr_idx];
while (i - cur_r >= 0 && i + cur_r < n2 && cpy[i + cur_r] == cpy[i - cur_r]) cur_r++;
cur_r--;
}
}
radius.push_back(cur_r);
if (cur_r + i > max_r) {
max_r = cur_r + i;
ctr = i;
}
if (cur_r > res_r) {
res_r = cur_r;
res_idx = i;
}
}
//cout << cpy << endl;
//for (int i = 0; i < n2; i++) {
// cout << radius[i];
//}
string res(s.begin() + (res_idx - res_r + 1) / 2, s.begin() + (res_idx + res_r - 1) / 2 + 1);
return res;
}