题4:最长回文子串

422 阅读1分钟

题4:最长回文子串

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

示例 1:

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

示例 2:

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

示例 3:

输入:s = "a"
输出:"a"

示例 4:

输入:s = "ac"
输出:"a"

提示:

1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

解题思路:

  1. 处理边界情况,如果字符长度小于2,则直接返回原字符串

  2. 定义两个变量,一个start存储当前找到的最大回文字符串的起始位置,另一个maxlength记录字符串的长度(终止位置就是start+maxlength)

  3. 创建一个help function,判断左边和右边是否越界,同时最左边的字符是否等于最右边的字符,如果以上三个条件都满足,则判断是否需要更新回文字符串的最大长度及最大字符串的起始位置,然后left--,right++,继续判断,直到不满足三个条件之一。

  4. 遍历字符串,每个位置调用help function两遍,第一遍检查i-1,i+1,第二遍检查i,i+1

    为什么要检查两遍?

    1.第一次以i为中心看能否构成最大回文子字符串

    2.第二次是假设没有中心,看是否有最大回文子字符串

图解:

Snipaste_2021-08-09_12-35-18.jpg

代码:

  /**
 * @param {string} s
 * @return {string}
 */
    var longestPalindrome = function (s) {
      if (s.length < 2) {
        return s;
      }
​
      let start = 0;
      let maxLength = 1;
      function expandAroundCenter(left, right) {
        while (left >= 0 && right < s.length && s[left] === s[right]) {
          if (right - left + 1 > maxLength) {
            maxLength = right - left + 1;
            start = left;
          }
          left--;
          right++;
        }
      }
      for (let i = 0; i < s.length; i++) {
        expandAroundCenter(i - 1, i + 1);
        expandAroundCenter(i, i + 1);
      }
      return s.substring(start, start + maxLength);
    };

补充知识点:

求a,b,c字符串长度:

索引号0,1,2;算法:2-0+1