JS算法之最长回文子串

134 阅读1分钟

前言

因为5月太忙了,没啥时间整理所学的知识啦,但是今年的目标是每个月输出至少两篇,所以俺就发一些之前做的LeetCode算法解答。

题目:寻找两个正序数组的中位数

题目来源: 最长回文子串 - 力扣(LeetCode)

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

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

示例 1:

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

示例 2:

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

提示:

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

解题思路

  1. 直接先把最长和最短的回文数排了,不让它继续往下执行
  2. 把字符串反转看看是否相同,相同则输出所有
  3. 写个函数从左到右遍历字符串,注意区分字符串长度为奇数和偶数的情况

代码

/**

@param {string} s
@return {string}
*/
var longestPalindrome = function(s) {
    //直接先把最长和最短的回文数排了,不让它继续往下执行
    //把字符串反转看看是否相同,相同则输出所有
    //测试了一下,加了这个判断能稳定提升20ms左右
    if (s === s.split('').reverse().join('')) {
        return s;
    }
    // 定义一个空字符串来接收回文串
    let res = '';
    for (let i = 0; i < s.length; i++) {
        //当回文数中心为奇数时执行此方法
        //比如aba,中心是b
        computedData(i, i);
        //当回文数中心为偶数时执行此方法
        //比如baab,中心是aa
        computedData(i, i + 1);
    }

    function computedData(left, right) {
        while (left >= 0 && right < s.length && s[left] === s[right]) {
            left--;
            right++;
        }

        if (res.length < right - left - 1) {
            res = s.slice(left + 1, right);
        }
    }
    return res
};