leetcode 91. Decode Ways

题目

A代表1 B代表2 C代表3 Z代表26
给你一个字符串如"12" 可以由 "AB" 也可以由“L”构成,求方案数

思路和代码

dp[i] 代表 到i-1为止有效的方案数
那么 dp[0] 必然=1, dp[1] 看 s[0] 是否为0
推广: 对于位置i, 如果 s[i-1]可以由A-Z代表, 那么 dp[i] += dp[i-1];
如果s[i-2] *10 + s[i-1] 可以由A-Z代表,那么dp[i] += dp[i-2];

class Solution {
public:
    
    int numDecodings(string s) {
        int len = s.size();
        if(len == 0) return 0;
        vector<int> dp(len+1, 0);
        // dp[i] means (i-1) is valid
        dp[0] = 1;
        dp[1] = s[0] == '0' ? 0 : 1;
        for(int i=2; i<=len; i++) {
            int first = s[i-1] - '0';
            int second = (s[i-2]-'0')*10 + s[i-1]-'0';
            if(first > 0)
                dp[i] += dp[i-1];
            if(second >= 10 && second <= 26)
                dp[i] += dp[i-2];
        }
        return dp[len];
    }
};
posted @ 2019-06-19 19:56  Draymonder  阅读(110)  评论(0编辑  收藏  举报