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];
};