leetcode 解码方法 中等

 

 

dp[i] 表示 s 前 i 个可以构成的方案数。

如果 s[i] == '0' 那么他的上一位只能是 '1' 或者 '2',此时 dp[i] += dp[i - 2];

如果 s[i] != '0' 那么他首先可以自成以为,即 dp[i] += dp[i -1],如果他与上一位构成的数是 11 ~ 26,那么 dp[i] += dp[i - 2]

class Solution {
public:
    int numDecodings(const string &s) {
        // dp[i] 表示 s 中前 i 个的方案数
        vector<int> dp(s.size() + 1, 0);
        dp[0] = 1;
        for(int i = 1; i <= s.size(); ++ i) {
            if(s[i - 1] == '0') {
                if(i > 1 && s[i - 2] >= '1' && s[i - 2] <= '2') dp[i] += dp[i - 2];
            } else {
                dp[i] += dp[i - 1];
                if(i > 1 && (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] <= '6'))) {
                    dp[i] += dp[i - 2];
                }
            }
        }
        return dp.back();
    }
};

 

posted @ 2021-09-21 14:30  rookie_Acmer  阅读(23)  评论(0编辑  收藏  举报