问题描述
A message containing letters from A-Z is being encoded to numbers using the following mapping:
‘A’ -> 1
‘B’ -> 2
…
‘Z’ -> 26
Given a non-empty string containing only digits, determine the total number of ways to decode it.
Example 1:Input: “12”
Output: 2
Explanation: It could be decoded as “AB” (1 2) or “L” (12).Example 2:
Input: “226”
Output: 3
Explanation: It could be decoded as “BZ” (2 26), “VF” (22 6), or “BBF” (2 2 6).
解
class Solution:
'''
解题思路:令matrix[i]表示输入的字符串str[0,i)(不包括i!)的组合情况,
则matrix[i]可以由之前的值的情况(matrix[i-1],matrix[i-2],matrix[i-3]...)推断而来
字母的数字表示范围为:1-26,因此,需要考虑matrix[i-1],matrix[i-2]的情况
1、当数字str[i-1],str[i-2]str[i-1]都不能正确的表示一个字母,说明整个字符串也不能匹配任何字母,返回0(例如80)
2、当数字str[i-1]可以表示一个字母,但是str[i-2]str[i-1]不能表示一个字母,matrix[i] = matrix[i-1] (例如83)
3、当数字str[i-1]不能表示一个字母,但是str[i-2]str[i-1]可以表示一个字母,matrix[i] = matrix[i-2] (例如20)
4、当数字str[i-1]可以表示一个字母,但是str[i-2]str[i-1]也可以表示一个字母,matrix[i] = matrix[i-2] + matrix[i-1](例如12)
'''
def numDecodings(self, s: str) -> int:
'''
如果输入的数字第一位是0,则匹配不上任何字母
'''
if(int(s[0]) == 0 ): return 0
'''
初始化地推数组
'''
length = len(s)
matrix = [ 0 for i in range(length +1) ]
matrix[0] = matrix[1] = 1
flag1 = flag2 =True
for i in range(2, length+1):
if int(s[i-1]) == 0 : flag1 =False
else : flag1=True
if int(s[i-2]) == 0 or (int(s[i-2])*10+int(s[i-1]) ) >26 : flag2=False
else: flag2=True
if flag1 == False and flag2 == False :
return 0
elif flag1 == False and flag2== True :
matrix[i] = matrix[i-2]
elif flag1 == True and flag2 == False :
matrix[i] = matrix[i-1]
else:
matrix[i]=matrix[i-1]+matrix[i-2]
return matrix[length]