1. 程式人生 > >[和小菜雞一起刷題(python)] LeetCode 91. 解碼方法 (Decode WAYS)

[和小菜雞一起刷題(python)] LeetCode 91. 解碼方法 (Decode WAYS)

LeetCode 91. 解碼方法 (Decode WAYS)

原題

一條包含字母 A-Z 的訊息通過以下方式進行了編碼:

‘A’ -> 1
‘B’ -> 2

‘Z’ -> 26

給定一個只包含數字的非空字串,請計算解碼方法的總數。

示例 1:

輸入: “12”
輸出: 2
解釋: 它可以解碼為 “AB”(1 2)或者 “L”(12)。

示例 2:

輸入: “226”
輸出: 3
解釋: 它可以解碼為 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。

思路

類似經典的爬樓梯問題,每次可以前進一步或兩步,用動態規劃來解決。不同的是,此題前進兩步存在一定的條件,數值上必須在10到26之間。此外,由於‘0’的出現可能造成無法解碼的問題。只有當‘0’之前出現‘1’或‘2’時才能繼續解碼。因此對於位置i,先判斷其是否為‘0’。判斷能否解碼,不能則返回0。再判斷s[i-1:i+1]的數值來決定要到達當前位置i是能只能通過前進兩步,一步還是一或兩步都可以。

程式碼

class Solution(object):
    def numDecodings(self, s):
        """
        :type s: str
        :rtype: int
        """
if s[0] == '0': return 0 last_1 = 1 last_2 = 1 for i in range(1,len(s)): if s[i] == '0' and (s[i-1] != '1' and s[i-1] != '2'): return 0 if int(s[i-1:i+1]) <= 26 and s[i]!='0': tmp = last_2 + last_1 if
s[i] != '0' and (int(s[i-1:i+1]) > 26 or s[i-1]=='0'): tmp = last_1 if s[i] == '0' and (s[i-1] == '1' or s[i-1] == '2'): tmp = last_2 last_2 = last_1 last_1 = tmp return last_1