最长回文子串

171 阅读1分钟

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

字符串方法:string.substr(start,length)

1、定义变量

/**
 * 字符串:s
 * 左边界:l
 * 右边界:r
 */

2、成为回文子串条件

l >= 0 && r < s.length && s[l] === s[r]

3、封装函数

满足回文条件,通过l--r++从中心向两边扩散,否则返回上一个满足条件的子串

 const palindrome = (s, l, r) => {
    while(l >= 0 && r < s.length && s[l] === s[r]){
        l--;
        r++;
    }
    return s.substr(l + 1, r - l - 1)
 }

4、字符串每个位置都可作为回文子串的中心,因此遍历字符串

let res = ''
for(let i = 0; i < s.length; i++){
    // 回文子串中心为一个字节
    let s1 = palindrome(s, i, i)
    // 回文子串中心为两个字节
    let s2 = palindrome(s, i, i + 1)
    // 取以上两种情况的最大值
    res = res.length > s1.length ? res : s1;
    res = res.length > s2.length ? res : s2
}

5、完整代码

var longestPalindrome = function(s) {
    // 中心往两边扩散
    const palindrome = (s, l, r) => {
        while(l >= 0 && r < s.length && s[l] === s[r]){
            l--;
            r++;
        }
        return s.substr(l + 1, r - l - 1)
    }

    let res = ''
    for(let i = 0; i < s.length; i++){
        // 一个中心点
        let s1 = palindrome(s, i, i)
        // 两个中心点
        let s2 = palindrome(s, i, i + 1)
        res = res.length > s1.length ? res : s1;
        res = res.length > s2.length ? res : s2
    }
    return res
};