动态游标for循环_【【动图算法】(动态规划篇):最长回文子串

035cdf99c165bb99f5a4463f26ed4757.png

本周继续做一道动态规划类型的题目,该题是阿里一面的一道算法题。

【动图算法】(动态规划篇):最长回文子串

leetcode 5 题:最长回文子串
https://leetcode-cn.com/problems/longest-palindromic-substring/

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

?
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

??
输入: "cbbd"
输出: "bb"

解答过程

动态规划-数组维护

var longestPalindrome = function(s) {
    let n = s.length
    let res = ''
    // 初始化一个n*n的二维数组
    let dp = Array.from(new Array(n),() => new Array(n).fill(0))
    for(let i = n-1;i >= 0;i--){
        for(let j = i;j             dp[i][j] = s[i] == s[j] && (j - i 2 || dp[i+1][j-1])
            if(dp[i][j] && j - i +1 > res.length)
                res = s.substring(i,j+1)
        }
    }
    return res
};
16437bf5ce307190b0c632f67c3fecac.gif

由动图可以很清楚的看到:

  • 首先初始化了一个n*n的二维数组
  • 而后在循环中进行判断:
    • 这里着重看 dp[i][j] = s[i] == s[j] && (j - i < 2 || dp[i+1][j-1])这里。
    • dp[i][j] = s[i] == s[j]判断为当前项是否为回文。
    • j - i < 2 判断其是否为最小奇偶字符串,即长度小于2
    • 若前一条不满足,则判断dp[i+1][j-1] 即其前一项是否依然为回文。

动态规划-中心扩展

var longestPalindrome = function(s) {
    if(!s || s.length 2) return s
    let start = 0,end = 0;
    let n = s.length
    // 中心扩展法
    let centerExpend = (left,right) => {
        while(left >= 0 && right             left--
            right++
        }
        return right - left - 1
    }
    for(let i = 0;i         let len1 = centerExpend(i,i)
        let len2 = centerExpend(i,i+1)
        let maxLen = Math.max(len1,len2)
        if(maxLen > end - start){
            // 这里的(maxLen - 1) >> 1即为对(maxLen-1)/2而后向下取整
            start = i - ((maxLen - 1) >> 1)
            end = i + (maxLen >> 1)
        }
    }
    return s.substring(start,end+1)
};
  • 这里以i作为中心点,在for循环中len1len2分别判断了奇偶字符串是否为回文。
  • 而后判断长度,截取字符串

相较于前一种方法,该方法则更为简单直观:通过中心点向数组的两端发散计算出回文的长度。最终得到正确的结果。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值