leetcode算法-5-最长回文子串

138 阅读1分钟

问题描述

给给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-palindromic-substring 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

求解

解法:中心扩散法

  • 遍历字符串,然后区分偶数和奇数两种情况
  • 同时进行两种中心扩散的方式,并取长度最大值
  • 接着可以通过获取的长度和中心点获取到起始和结束的下标
  • 若当前长度最大值大于原先的end-start,则获取新的end和start
  • 最后通过start和end获取最终的结果
/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function (s) {
    if (!s || s.length < 2) return s
    let len = s.length;
    let start = 0
    let end = 0
    const getPalindrome = (l, r) => {
        while (l >= 0 && r < s.length && s[l] === s[r]) {
            l--
            r++
        }
        return r - l - 1
    }

    for (let i = 0; i < len; i++) {
        let len1 = getPalindrome(i, i)
        let len2 = getPalindrome(i, i + 1)
        let maxLen = Math.max(len1, len2)
        if (maxLen > end - start) {
            start = i - Math.floor((maxLen - 1) / 2)
            end = i + Math.floor(maxLen / 2)
        }
    }

    return s.slice(start, end + 1)
};

执行结果

执行用时 :92 ms, 在所有 JavaScript 提交中击败了86.67%的用户
内存消耗 :35.6 MB, 在所有 JavaScript 提交中击败了100.00%的用户
提交结果 执行用时 内存消耗
通过 92ms 35.6MB

本文使用 mdnice 排版