持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【LeetCode 91. 解码方法 】- JavaScript(动态规划)
题目描述
一条包含字母 A-Z 的消息通过以下映射进行了 编码 :
'A' -> "1" 'B' -> "2" ... 'Z' -> "26"要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:
- "AAJF" ,将消息分组为 (1 1 10 6)
- "KJF" ,将消息分组为 (11 10 6)
注意,消息不能分组为 (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 "06" 在映射中并不等价。
给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。
题目数据保证答案肯定是一个 32 位 的整数。
示例 1:
输入:s = "0" 输出:0 解释:没有字符映射到以 0 开头的数字。 含有 0 的有效映射是 'J' -> "10" 和 'T'-> "20" 。 由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。
动态规划
思路分析:
整体的的思路:和爬楼梯的思路差不多,只是需要根据限制条件做些处理。按照题意模拟 比较当前c[i]是否位'0',为'0'则c[i-1]必须是1或者2,此时c[i]和c[i-1]解码为一个字符,即dp[i]=dp[i-2],否则直接返回0。不为'0'则看c[i-1]是否为0,不为0则比较c[i-1]c[i]是否在1-26的范围内,在的话就可以两种组合,即dp[i] = dp[i-1]+dp[i-2]。其他情况只能有一种组合,即dp[i] = dp[i-1],具体如下:
- DP思路是分析每一位之前的情况和。
- 如果s[i - 1]处不为0,则需要收集。同时由于dp[i - 2]与dp[i - 1]的情况并不重合。所以可以同时收入。
- s[i - 1] 为0时是不需要收集的,因为0位本身是继承了前面的情况,本身是没有多余的情况。
var numDecodings = function(s) {
let dp = new Array(2).fill(0);
dp[1] = 1;
for (let i=0; i<s.length; i++) {
let a = (+s[i] !== 0) ? dp[1] : 0;
let b;
if (i === 0) b = 0;
else {
let t = +(s[i-1] + s[i]);
if (t >= 10 && t <= 26) b = dp[0];
else b = 0;
}
dp[0] = dp[1];
dp[1] = a + b;
}
return dp[1];
};
思考
题目其实不是很难,只是有点恶心人,确定状态转移方程5分钟,处理边界条件2小时。
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤