算法挑战12(双指针): 最长回文子串

5 阅读1分钟

坚持就是胜利!

6.最长回文子串

给你一个字符串 s,找到 s 中最长的 回文 子串。

思路: 中心扩散法

  • 每个字符都可以作为回文中心

  • 分两种情况:

    1. 奇数长度:中心是一个字符 i
    2. 偶数长度:中心是两个字符 ii+1

每次扩散发现更长的回文时:

  1. 更新最长长度 max_len
  2. 记录起始下标 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);
};