一条包含字母 A-Z
的消息通过以下映射进行了 编码 :
'A' -> 1
'B' -> 2
...
'Z' -> 26
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106"
可以映射为:
"AAJF"
,将消息分组为(1 1 10 6)
"KJF"
,将消息分组为(11 10 6)
注意,消息不能分组为 (1 11 06)
,因为 "06"
不能映射为 "F"
,这是由于 "6"
和 "06"
在映射中并不等价。
给你一个只含数字的 非空 字符串 s
,请计算并返回 解码 方法的 总数 。
题目数据保证答案肯定是一个 32 位 的整数。
示例 1:
输入:s = "12"
输出:2
解释:它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入:s = "226"
输出:3
解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
思路:动态规划方法
# [91] 解码方法
#动态规划
#dp【i】表示从0-i个数字表示的映射数
# @lc code=start
class Solution:
def numDecodings(self, s: str) -> int:
lens=len(s)
dp=[0 for _ in range(lens)]
if s[0]!="0":
dp[0]=1
else:
return 0
if len(s)==1:
return dp[0]
else:
x=1 if s[1]!="0" and dp[0]!=0 else 0
y=1 if int(s[0:2]) in range(10,27) else 0
dp[1]=x+y
for i in range(2,lens):
x=dp[i-1] if s[i]!="0" and dp[i-1]!=0 else 0
y=dp[i-2] if int(s[i-1:i+1]) in range(10,27) else 0
dp[i]=x+y
return dp[lens-1]
# @lc code=end