LeetCode 91 [Decode Ways]

原題

有一個消息包含A-Z通過以下規則編碼

'A' -> 1
'B' -> 2
...
'Z' -> 26

現在給你一個加密過后的消息,問有幾種解碼的方式

樣例
給你的消息為12,有兩種方式解碼 AB(12) 或者 L(12). 所以返回 2

解題思路

  • 求有幾種解碼方式而不是具體每種解碼方式是什么 - 動態規劃 - Sequence DP
  • cache[i]表示以第i個字符結尾的字符串有幾種解碼方式
  • 初始化
  • cache[0] = 1 空字符串認為有是一種解碼方式
  • cache[1] = 1 一個字符肯定只有一種解法方式 (最開始記得判斷第一個字符是0返回0種解碼方式)
  • 狀態轉移方程,cache[i] 要考慮和上一位組成的數字具體是多少
  • 如果是00,30,40,50,60,70,80,90 => cache[i] = 0 (無解) s[i - 1]如果是0要仔細考慮
  • 如果是01~09,比如,1501 => 150有幾種解(因為0單獨不會有解)
  • 如果是10~26其中不包括10,20的話,則有兩種情況,比如1512 => 15有幾種解(L) + 151有幾種解(B)
  • 如果等于10或者20,比如,1510 => 15有幾種解(因為0單獨不會有解, J(10)/T(20))
  • 如果大于26,比如,1527 => 152有幾種解

完整代碼

class Solution(object):
    def numDecodings(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s or s[0] == "0":
            return 0
            
        cache = [0 for i in range(len(s) + 1)]
        cache[0] = cache[1] = 1
        for i in range(2, len(s) + 1):
            num = int(s[i-2:i])
            if num == 0 or (s[i - 1] == "0" and num > 26): # 100 or 130
                cache[i] = 0
            elif num < 10: # 109
                cache[i] = cache[i - 1]
            elif num < 27: 
                if num == 10 or num == 20: # 110 or 120
                    cache[i] = cache[i - 2]
                else: # 117, 126 ...
                    cache[i] = cache[i - 1] + cache[i - 2]
            else: # 127, 178
                cache[i] = cache[i - 1]
                
        return cache[len(s)]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容