leetcode--最长回文字符串

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"

1.暴力解法
排列组合所有可能的字符串

/**
 * 回文
 * @param {String} s 
 * 
 *  
 */
var longestPalindrome = function(s) {
    var len = s.length;
    var tmpStr = '';//子串
    var maxStr = '';//最长回文

    for(let m = 0 ; m < len ; m ++){
        for(let n = m  ; n < len ; n ++){
            tmpStr = s.substring(m,n + 1);
            if(tmpStr === tmpStr.split('').reverse().join('') && maxStr.length < tmpStr.length){
                maxStr = tmpStr;
            }
        }
    }
    return maxStr;
};

2.中心法
下面这个写法好理解一点

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function (s) {
    var maxL = 0;
    var maxR = 0;
    var maxLen = 0;
    var len = s.length;
    var left = 0;
    var right = 0;
    for (let i = 0; i < len; i++) {
        left = i;
        right = i;

        while (s[left] && s[right] && s[left] === s[right]) {
            left = left - 1;
            right = right + 1;
        }
        left = left + 1;
        right = right - 1;
        //奇数
        if (right - left + 1 > maxLen) {
            maxL = left;
            maxR = right;
            maxLen = right - left + 1;
        }

        left = i;
        right = i + 1;
        while (s[left] && s[right] && s[left] === s[right]) {
            left = left - 1;
            right = right + 1;
        }
        left = left + 1;
        right = right - 1;
        //偶数
        if (right - left + 1 > maxLen) {
            maxL = left;
            maxR = right;
            maxLen = right - left + 1;
        }
    }

    return s.substring(maxL,maxR + 1);
};

这个优雅一点

var longestPalindrome = function (s) {
    var maxL = 0;
    var maxR = 0;
    var maxLen = 0;
    var len = s.length;
    var left = 0;
    var right = 0;
    for (let i = 0; i < len; i++) {
        left = i;
        right = i;

        var len1 = expand(s,left,right);
        var len2 = expand(s,left,right + 1);
        var maxOfTwo = Math.max(len1,len2);
        if (maxOfTwo > maxLen) {
            maxL = left - Math.floor((maxOfTwo - 1)/2);
            maxR = left + Math.floor((maxOfTwo)/2);
            maxLen = maxR - maxL + 1;
        }
    }
    return s.substr(maxL,maxLen);
};

function expand(s,l,r){
    while (s[l] && s[r] && s[l] === s[r]) {
        l = l - 1;
        r = r + 1;
    }
    l = l + 1;
    r = r - 1;
    return r - l + 1;
}

下面这篇讲解的思虑比较清晰,可以参考
算法题解:从字符串中查找最长的回文子串(搜索最佳结果的一般方法)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值