最长回文子串(https://leetcode.cn/problems/longest-palindromic-substring/)

53 阅读2分钟

题目描述

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

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

 

示例 1:

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

示例 2:

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

 

提示:

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

思路:

  1. 思路:遍历s ,假设便利到的每一个字符都是回文子串的中心,向两边扩散, 回文字串的长度可能是奇数也可能是偶数(取二者较大值)
  2. help() 函数的作用就是传入中心的两个字符(其实还有s,以及res),返回 res和此时中心字符对应的回文串的较长者。
  3. 如果是奇数,初始的中心为s.charAt(i),显然 s.charAt(i)===s.charAt(i),如果是偶数,初始中心为s.charAt(i)s.charAt(i+1),至于二者是否相等,让help()函数自行判断。
  4. 向两边持续扩散,直到其中一边到达边界或者对应位置不相等
  5. slice 函数连头不连尾。

题解:

/**  
* @param {string} s  
* @return {string}  
*/
var longestPalindrome = function(s) {
    if(s.length<2)
        return s;
    let res  = '';
    //思路:遍历s 假设s为回文子串的中心,向两边扩散 回文字串的长度可能是奇数也可能是偶数,(取较大值)
    for(let i = 0;i<s.length;i++){
        //处理奇数
        help(i,i);
        //处理偶数
        help(i,i+1)
    }
        
    function help(p,q){
        // 循环判断,直到不能满足是回文子串
        while(p>0 && q<s.length && s.charAt(p)===s.charAt(q)){
            p--;
            q++;
        }
        //最后一次符合条件的时候,p-- q++ 了,额外多操作了一次,可以做一次还原
        p++;
        q--;
        //slice连头不连尾 ,但是此时我们需要尾,因此q++
        let str = s.slice(p,q+1);
        res = res.length > str.length ? res : str;
        
        //以上四行代码可以优化为两行
        //let str = s.slice(p+1,q);
        //res = res.length > str.length ? res : str;
        
    }

    return res;

};