【LeetCode算法题解】4、最长回文子串

260 阅读1分钟

题目

难度:⭐️⭐️

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

示例

示例 1:

输入:s = "babad"

输出:"bab"

解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"

输出:"bb"

示例 3:

输入:s = "a"

输出:"a"

示例 4:

输入:s = "ac"

输出:"a"  

提示:

1 <= s.length <= 1000

s 仅由数字和英文字母(大写和/或小写)组成

题解

/**
* @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)
    }

    // String().substring():从字符串中提取到索引(位置)之间的字符,并返回子字符串。
    // 不会更改原始字符串
    return s.substring(start, start+maxLength);


};

笔记

1、如果字符串长度小于2,直接返回原字符串

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

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

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