leetcode_[python/C++]_91_Decode Ways_動態規劃

題目鏈接
【題目】
A message containing letters from A-Z is being encoded to numbers using the following mapping:
‘A’ -> 1
‘B’ -> 2

‘Z’ -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.

For example,
Given encoded message “12”, it could be decoded as “AB” (1 2) or “L” (12).
The number of ways decoding “12” is 2.
【解析】
採用動態規劃的方法。
網上有空間複雜度爲O(n)的做法比如:

class Solution {
public:
    int numDecodings(string s) {
        if (s.empty() || (s.size() > 1 && s[0] == '0')) return 0;
        vector<int> dp(s.size() + 1, 0);
        dp[0] = 1;
        for (int i = 1; i < dp.size(); ++i) {
            dp[i] = (s[i - 1] == '0') ? 0 : 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();
    }
};

這裏採用一種空間複雜度爲O(1)的方法(AC)【很快】:
兩個變量p1,p2
初始爲1
1)當s[i]==’0’時候,p1 = 0
2)當s[i] !=’0’時候,則當s[i-1]==’1’或者s[i-1]==’2’且s[i-1]<=’6’時候,p1 = p1 + p2(相當於加上前面的總數,p2記錄上一次的總數)
p2 = p1 - p2(其實就是p2等於之前的p1)
3)否則,p2 = p1

class Solution {
public:
    int numDecodings(string s) {
        if(s[0] == '0' || s.length() == 0) return 0;
        int p1=1,p2=1;
        for(int i=1;i<s.length();i++){
            if(s[i] == '0') p1 = 0;
            if(s[i-1] == '1' || s[i-1] == '2' && s[i] <= '6'){
                p1 = p2 + p1;
                p2 = p1 - p2;
            }
            else p2 = p1;
        }
        return p1;
    }
};

python


(1)

class Solution(object):
    def numDecodings(self, s):
        """
        :type s: str
        :rtype: int
        """
        if len(s) is 0:
            return 0
        dp = [1] + [0]*len(s)
        for i in range(1,len(s)+1):
            dp[i] = 0 if s[i-1]=='0' else dp[i-1]
            dp[i] += dp[i-2] if (i>1 and (s[i-2]=='1' or (s[i-2] == '2' and s[i-1] <= '6'))) else 0
        return dp[len(s)]

(2)

class Solution(object):
    def numDecodings(self, s):
        if (len(s) == 0 or s[0] == '0'):
            return 0
        p1 = 1
        p2 = 1
        for i in range(1,len(s)):
            if s[i] == '0':
                p1 = 0
            if s[i-1] == '1' or (s[i-1] == '2' and s[i] <= '6'):
                p1 = p1 + p2
                p2 = p1 - p2
            else:
                p2 = p1
        return p1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章