坚持就是胜利!
6.最长回文子串
给你一个字符串 s,找到 s 中最长的 回文 子串。
思路: 中心扩散法:
-
每个字符都可以作为回文中心
-
分两种情况:
- 奇数长度:中心是一个字符
i - 偶数长度:中心是两个字符
i和i+1
- 奇数长度:中心是一个字符
每次扩散发现更长的回文时:
- 更新最长长度 max_len
- 记录起始下标 start = left最后用
var longestPalindrome = function (s) {
let max_len = 0;
let start = 0;
for (let i = 0; i < s.length; i++) {
// 奇数长度回文
let left = i;
let right = i;
while (left >= 0 && right < s.length && s[left] === s[right]) {
// 先判断,再更新
if (right - left + 1 > max_len) {
max_len = right - left + 1;
start = left; // 这里必须是下标 left
}
left--;
right++;
}
// 偶数长度回文
left = i;
right = i + 1;
while (left >= 0 && right < s.length && s[left] === s[right]) {
if (right - left + 1 > max_len) {
max_len = right - left + 1;
start = left; // 下标
}
left--;
right++;
}
}
// 截取正确:开始索引 → 开始索引+长度
return s.substring(start, start + max_len);
};