【LeetCode-91】解码方法
问题
一条包含字母 A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例
输入:"226"
输出:3
解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
解答
class Solution {
public:
int numDecodings(string s) {
if (s.empty() || s[0] == '0') return 0;
int pre = 1, cur = 1;
for (int i = 1; i < s.size(); i++) {
int tmp = cur;
if (s[i] == '0') { // 0时可能会解码失败,单独讨论
if (s[i - 1] == '1' || s[i - 1] == '2') cur = pre;
else return 0; // 解码失败
}
else if (s[i] < '7' && s[i - 1] == '2' || s[i - 1] == '1') cur += pre; // 当前位置有两种解码方法
pre = tmp; // 当前位置只有一种解码方法时cur = pre,即不变
}
return cur;
}
};
重点思路
本题使用动态规划求解,状态转移方程与自己和前一个数有关。
先考虑存在0的情况。0只能和前一个值一起解码,只有10
和20
有意义,出现其他的说明解码错误,直接输出0。如果有意义的话,那么可能性为dp[i - 2]
,本题对应pre
的值。
再考虑输入中不存在0的情况。这种情况下,解码存在歧义的条件为:上一个值等于2时,当前值小于等于6;或者当上一个值等于1时,当前可以取任意值。对应以下两种情况
- 如果存在歧义,则将当前值单独解码,可能性为
dp[i - 1]
种。将当前值与上一个值合起来解码,可能性为dp[i - 2]
种,加起来就是dp[i - 1] + dp[i - 2]
; - 如果不存在歧义,那么只能单独解码,可能性为
dp[i - 1]
。