LeetCode-最长回文子串

87 阅读1分钟

5. 最长回文子串

难度中等5258收藏分享切换为英文接收动态反馈

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

 

示例 1:

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

示例 2:

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

 

提示:

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

暴力遍历方法

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    // 边界处理,数组为空或者长度为1时
    if (!s || s.length === 1) {
        return s;
    }

    let maxLen = 0;
    let longStr = '';
    
    // 遍历
    for(let i = 0; i < s.length - 1; i++) {
        for(let j = i + 1; j <= s.length; j++) {
            let str = s.substring(i, j);
            // console.log(str);
            if (str.length > maxLen && str === str.split('').reverse().join('')) {
                maxLen = str.length;
                longStr = str;
            }
        }
    }

    return longStr;
};

优化

两种情况

一种是回文子串长度为奇数(如aba,中心是b) 另一种回文子串长度为偶数(如abba,中心是b,b)

循环遍历字符串 对取到的每个值 都假设他可能成为最后的中心进行判断,返回最长的回文子串

var longestPalindrome = function(s) {
            // 处理边界情况,s为空或者长度为1时
            if (s.length < 2) {
                return s;
            }
            
            let maxStr = '';
            for(let i = 0; i < s.length; i++) {
                // 奇数回文子串,假设i为回文中心点
                let left = i - 1;
                let right = i + 1;
                while(left >= 0 && right < s.length && s[left] === s[right]){
                    left -- ;
                    right ++;
                }
                if (right - left - 1 > maxStr.length) {
                    maxStr = s.substring(left + 1, right);
                }

                // 偶数回文子串,假设为回文的left
                left = i;
                right = i + 1;
                while(left >= 0 && right < s.length && s[left] === s[right]){
                    left -- ;
                    right ++;
                }
                if (right - left - 1 > maxStr.length) {
                    maxStr = s.substring(left + 1, right);
                }
            }

            return maxStr;
        }