LeetCode[每日一题]91.解码方法 \ 以及对于动态规划的思考

4.21 91.解码方法

每个字母映射为1-26的数字
给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数
输入:s = “226”
输出:3
解释:它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。

题目分析

使用动态规划,可能用一位数字编码或者两位数字编码

动态规划组成部分一 确定状态

dp[i]表示i个字符有多少种解码方式
最后的结果就是dp[s.length]

动态规划组成部分二 转移方程

1、最后一次编码使用一个字符,s[i],dp[i] = dp[i-1]
2、最后一次解码使用两个字符,s[i-1]+s[i] ,dp[i] = dp[i-2]

动态规划组成部分三 初始条件 边界条件

dp.length >= s.length+1,需要能够包含全部结果;
dp[0] = 1;
空字符串只有一种解码结果,为空

动态规划组成部分四 计算顺序

自底向上(递归就是顶向下,计算多重复,可以设置备忘录保存计算过的数据,再使用到直接调用)

var numDecodings = function(s) {
    var len = s.length;
    const dp = new Array(len+1).fill(0);
    dp[0] = 1;
    for(var i = 1;i<=len;i++){
        if(s[i-1] !== '0'){
            dp[i] += dp[i-1]
        }
        if(i > 1 && s[i-2] != '0' && ((s[i-2]-'0') * 10 + (s[i - 1]-'0') <= 26)){
            dp[i] += dp[i-2]
        }
    }
    return dp[len];

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值