5. 最长回文子串「力扣」

题目描述

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

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

示例 1:

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

示例 2:

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

解题

回文字符串,无非有两种类型,adabaab,分为奇偶长度两种。
单考虑偶数的话,如下:

分析👇

// 现有一字符串 str
const str = 'cbaabc'
// 
str[2]===str[3]
str[1]===str[4]
str[0]===str[5]
//  str 为回文字符串

有没有看出什么规律,左侧的下标做减法,右侧的下标做加法。只要都相等,即是回文字符串!

源码如下:

var longestPalindrome = function(s) {
    let str = ''
    if(s.length < 2) return s
    for(let i = 0, len = s.length; i < len; i++) {
        let l1 = i, r1 = i
        let l2 = i, r2 = i + 1
        // 判断奇数长度的
        while(l1 > -1 && r1 < len && s[l1] === s[r1]) {
            r1 - l1 + 1 > str.length && (str = s.slice(l1, r1 + 1))
            l1--
            r1++
        }
        // 判断偶数长度的
        while(l2 > -1 && r2 < len && s[l2] === s[r2]) {
            r2 - l2 + 1 > str.length && (str = s.slice(l2, r2 + 1))
            l2--
            r2++
        }
    }
    return str
};