5.数据结构与算法——最长回文子串

48 阅读2分钟

题目介绍

给你一个字符串 s,找到 s 中最长的回文子串(字符串中连续的字符序列)。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。

示例 2:

输入: s = "cbbd"
输出: "bb"

 

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

 

提示:

  • 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);
}