[和小菜雞一起刷題(python)] LeetCode 91. 解碼方法 (Decode WAYS)
阿新 • • 發佈:2018-12-25
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