题目介绍
给你一个字符串 s,找到 s 中最长的回文子串(字符串中连续的字符序列)。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。
示例 2:
输入: s = "cbbd"
输出: "bb"
提示:
1 <= s.length <= 1000s仅由数字和英文字母组成
提示:
-
1 <= s.length <= 1000 -
s仅由数字和英文字母组成
题目解析
function longestPalindrome(s: string) {
if (s.length < 2) {
return s;
}
// 创建 左右指针,用于保存最长回文子串的范围
let left = 0,
right = 0;
// 保存字符串长度,防止重复读取长度
const len = s.length;
for (let i = 0; i < s.length; i++) {
//此处注意一下:如 bcdcbi 是一个总长度为6的偶数,然而它的回文子串为 bcdcb,是奇数
//如 accdb 是奇数,而 回文子串 cc 是偶数
//所以这里要假设 此回文子串,既可能是偶数,也可能是奇数
//所以底下是要都调用,而不是判断 s 的长度是偶数还是奇数,从而去调用
// 偶数回文子串 baab
helper(i, i + 1);
//偶数回文子串 bab
helper(i, i);
}
function helper(minIndex: number, maxIndex: number) {
//满足此条件,则是回文子串,将minIndex左移,将maxIndex右移,然后再检查是否是回文数
while (minIndex >= 0 && maxIndex <= len && s[minIndex] === s[maxIndex]) {
minIndex--;
maxIndex++;
}
//当不满足回文数时,则进入这个阶段
//由于 helper函数是每个字符都会调用的,所以要查看 这次发现的回文子串长度 是否大于 之前字符所发现的回文子串
if (maxIndex - minIndex > right - left) {
right = maxIndex;
left = minIndex;
}
}
// 注意,在while循环中,minIndex会多减一次,maxIndex会多加一次,以达到不满足条件的情况
//所以 left要+1,right不用-1,因为slice会排除结束位置索引
return s.slice(left + 1, right);
}