8/22 动态规划:最长子序列,最大子数组和

连续子数组的最大和

	var maxSubArray = function(nums) {
    const dp = new Array(nums.length+1).fill(-101)
    dp[0] = nums[0]
    for(let i = 1;i<nums.length;i++) {
        dp[i] = Math.max(dp[i-1]+nums[i],nums[i])
    }
    return Math.max(...dp)
};

编辑距离

var minDistance = function(word1, word2) {
    const dpArr = Array.from(new Array(word1.length).fill(-1),()=>new Array(word2.length).fill(-1))
    const dp = (i,j) => {
        if(i===-1) {
            return j+1
        }
        if(j===-1) {
            return i+1
        }
        if(dpArr[i][j]!==-1) {
            return dpArr[i][j]
        }
        if(word1[i] === word2[j]) {
            dpArr[i][j] = dp(i-1,j-1)
            return dpArr[i][j]
        }
        dpArr[i][j] = Math.min(
            dp(i-1,j-1)+1,
            dp(i,j-1)+1,
            dp(i-1,j)+1
        )
        return dpArr[i][j]
    }
    return dp(word1.length-1,word2.length-1)
};

最长公共子序列

var longestCommonSubsequence = function(text1, text2) {
    const arr = Array.from(new Array(text1.length).fill(-1),()=>new Array(text2.length).fill(-1))
    const dp = (i,j) => {
        if(i === -1 || j === -1) return 0
        if(arr[i][j] !== -1) return arr[i][j]
        if(text1[i] === text2[j]) {
            arr[i][j] = dp(i-1,j-1)+1
            return arr[i][j]
        }
        arr[i][j] = Math.max(
            dp(i-1,j-1),
            dp(i-1,j),
            dp(i,j-1)
        )
        return arr[i][j]
    }
    return dp(text1.length-1,text2.length-1)
};

正则表达式匹配

从右边向左边匹配

var isMatch = function(s, p) {
    const arr = Array.from(new Array(s.length),()=>new Array(p.length).fill(0))
    const dp = (i,j) => {
        if(i === -1 && j===-1) return true
        if(i===-1) {
            if(p[j]!=='*') 
            return false
            else return dp(i,j-2)
        }
        if(j===-1) {
            return false
        }
        if(arr[i][j]!==0) {
            return arr[i][j]
        }
        if(s[i] === p[j] || p[j]==='.') {
            arr[i][j]=dp(i-1,j-1)
            return arr[i][j]
        }
        if(p[j]!=='*') {
            s[i][j] = false
            return false
        }
        if(s[i]!==p[j-1]&&p[j-1]!=='.') {
            arr[i][j] = dp(i,j-2)
            return arr[i][j]
        }
        arr[i][j] = dp(i-1,j) || dp(i-1,j-2) || dp(i,j-2)
        return arr[i][j]
    }
    return dp(s.length-1,p.length-1)
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperHaker~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值