【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只能和前一个值一起解码,只有1020有意义,出现其他的说明解码错误,直接输出0。如果有意义的话,那么可能性为dp[i - 2],本题对应pre的值。

再考虑输入中不存在0的情况。这种情况下,解码存在歧义的条件为:上一个值等于2时,当前值小于等于6;或者当上一个值等于1时,当前可以取任意值。对应以下两种情况

  • 如果存在歧义,则将当前值单独解码,可能性为dp[i - 1]种。将当前值与上一个值合起来解码,可能性为dp[i - 2]种,加起来就是dp[i - 1] + dp[i - 2]
  • 如果不存在歧义,那么只能单独解码,可能性为dp[i - 1]
posted @ 2020-12-29 08:51  tmpUser  阅读(94)  评论(0编辑  收藏  举报