https://leetcode.com/problems/decode-ways

[輸入]

length(s) = n;

[暴力法]

將s按照一位或兩位的方式切割,試過所有組何,看是否是合法並累計之。
在每個決策點 展成一顆 二元樹,故知道葉節點共有O(2^n)個;
所以暴力法複雜度是O(n*2^n)
二元樹例子如下:

[遞迴公式]:


[bottom up]

[Time Complexity]

[Space Complexity]

[Example]

[Solution]


class Solution {
public:
    int numDecodings(string s) {
        if (!s.length()) {
            return 0;
        } else if (s.at(0) == '0') {
            return 0;
        }
        vector<int> v(s.length() + 1, 0);
        v[0] = 1;
        v[1] = 1;
        int prev = s.at(0) - '0';
        for (int i = 1; i < s.length(); i++) {
            int now = (s.at(i) - '0');
            int n = 10 * prev + now;
            if (n > 26) {
                if (now == 0) {
                    return 0;
                }
                v[i + 1] = v[i];
            } else {
                if (n == 0)  {
                    return 0;
                } else if (now == 0) {
                    v[i + 1] = v[i - 1];
                } else if (prev == 0) {
                    v[i + 1] = v[i];
                } else { 
                    v[i + 1] = v[i] + v[i - 1];
                }
            }
            prev = now;
        }
        return v[s.length()];
    }
};

留言

這個網誌中的熱門文章

https://leetcode.com/contest/leetcode-weekly-contest-52/problems/longest-univalue-path/

https://leetcode.com/contest/leetcode-weekly-contest-52/problems/maximum-sum-of-3-non-overlapping-subarrays/