【发布时间】:2019-03-07 22:28:54
【问题描述】:
所以被问到的问题是:
使用以下映射将包含 A-Z 字母的消息编码为数字:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个仅包含数字的非空字符串,确定解码方法的总数。
示例 1:
Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).
示例 2:
Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
我解决这个问题的效率非常低,正在寻找其他解决方案,发现动态编程是解决这个问题的好方法。由于 DP 对我来说是新的,我一直在阅读它,现在回到我看到的解决方案,我试图理解这个人使用的自下而下方法背后的逻辑。
function numDecodings(s) {
if (s.length === 0) return 0;
const N = s.length;
const dp = Array(N+1).fill(0);
dp[0] = 1;
dp[1] = s[0] === '0' ? 0 : 1;
for (let i = 2; i <= N; i++) {
if (s[i-1] !== '0') {
dp[i] += dp[i-1];
}
if (s[i-2] === '1' || s[i-2] === '2' && s[i-1] <= '6') {
dp[i] += dp[i-2];
}
}
return dp[N];
}
【问题讨论】:
标签: algorithm dynamic-programming