LeetCode 热题 HOT — 最长回文子串

264 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 2 天,点击查看活动详情

最长回文子串

原题地址

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

示例 1:

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

示例 2:

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

提示:

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

思路分析

方法一

  1. 最简单最粗暴的方式,找出字符串 s 中所有的回文子串,然后寻找最长的那个即可;
  2. 定义一个辅助方法 help,来判断一个字符串是不是回文子串,判断一个字符串是否为回文子串的方法,只需要判断一个字符串中 第i项第len-i-1项 是否相同即可。
  3. 两次遍历字符串,判断组成的字符串中是回文子串的并且长度最长的,返回即可。

方法二

  1. 使用中心扩展,遍历数组,找到连续一样的字符串,然后左右扩展,直到左右两侧不一致为止;
  2. 定义当前最大回文串的长度以及当前最大的回文串,以当前遍历的这个字符为中心,左右两侧遍历,找到当前字符后连接的所有一样的字符,更新 i 的指针和 str 即可。

AC 代码

方法一

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    let res = ""
    let max = 0
    let len = s.length
    for (let i = 0; i < len; i++)
        for (let j = i + 1; j <= len; j++) {
            const str = s.substring(i, j)
            if (help(str) && str.length > max) {
                res = s.substring(i, j)
                max = Math.max(max, res.length)
            }
        }
    return res
};

var help = function (s) {
    const len = s.length
    for (let i = 0; i < len / 2; i++) {
        if (s.charAt(i) != s.charAt(len - i - 1)) {
            return false
        }
    }
    return true
}

结果:

  • 执行结果: 通过
  • 执行用时:5232 ms, 在所有 JavaScript 提交中击败了5.00%的用户
  • 内存消耗:47.3 MB, 在所有 JavaScript 提交中击败了35.18%的用户
  • 通过测试用例:180 / 180

方法二

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    let maxLen = 0
    let res = ''
    for (let i = 0; i < s.length; i++) {
        let str = s[i]
        let left = i - 1
        while (s[i + 1] === s[i]) {
            str += s[i]
            i++
        }
        let right = i + 1
        while (s[left] === s[right] && s[left] !== undefined) {
            str = s[left] + str + s[left]
            left--
            right++
        }
        if (str.length > maxLen) {
            maxLen = str.length
            res = str
        }
    }
    return res
}

结果:

  • 执行结果: 通过
  • 执行用时:72 ms, 在所有 JavaScript 提交中击败了97.75%的用户
  • 内存消耗:48.8 MB, 在所有 JavaScript 提交中击败了28.75%的用户
  • 通过测试用例:180 / 180

END