【重点!DP】LeetCode 639. Decode Ways II

LeetCode 639. Decode Ways II

参考网址:https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-639-decode-ways-ii/
Solution1:
动态规划
这里写图片描述
这里写图片描述
先写清楚思路,再写代码~

// Author: Huahua
// Runtime: 58 ms
class Solution {
public:
    int numDecodings(string s) {
        if (s.empty()) return 0;        
        //           dp[-1]  dp[0]
        long dp[2] = {1, ways(s[0])};
        for (int i = 1; i < s.length(); ++i) {
            long dp_i = ways(s[i]) * dp[1] + ways(s[i - 1], s[i]) * dp[0];
            dp_i %= kMod;
            dp[0] = dp[1];
            dp[1] = dp_i;
        }
        return dp[1];
    }
private:
    static constexpr int kMod = 1000000007;    

    int ways(char c) {
        if (c == '0') return 0;
        if (c == '*') return 9;
        return 1;
    }

    int ways(char c1, char c2) {
        if (c1 == '*' && c2 == '*') 
            return 15;
        if (c1 == '*') {
          return (c2 >= '0' && c2 <= '6') ? 2 : 1;
        } else if (c2 == '*') {
            switch (c1) {
                case '1': return 9;
                case '2': return 6;
                default: return 0;
            }
        } else {
            int prefix = (c1 - '0') * 10 + (c2 - '0');
            return prefix >= 10 && prefix <= 26;
        }        
    }
};

猜你喜欢

转载自blog.csdn.net/Allenlzcoder/article/details/81431395