#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 解码
# @param nums string字符串 数字串
# @return int整型
#
"""
参考: https://blog.nowcoder.net/n/b9191b0cce22473bbaba14b4aad2e9ec
用辅助数组dp[i] 表示前i个译码方法有多少种
对于一个数可以直接译码们,也可以与前面的1或者2组合译码
122
直接译码 dp[i]=dp[i-1] 12[2]
组合译码 dp[i]=dp[i-2] 1[22]
对于只有一种译码:
dp[i]=dp[i-1]
对于满足两种译码的(10 和20 不能)则是
dp[i]=dp[i-1]+dp[i-2] 相加
最后dp[lenght] 为答案
状态转移:
dp[i] :
1. 1 i=0 或是1
2. dp[i-1]+dp[i-2] 11-19 ,21-26
3.dp[i-1] ,other
代码逻辑:
1. 字符串为"0" 返回0
2. 字符串为"10" ,"20" 只有一种 返回1
3. 字符串中"0" 前面不是"1" 或是"2"无法译 0种
4. 定义辅助数组dp[len(nums)+1] 初始化为1
5. 遍历[2,nums.length]
情况1 ; 11-19 ,21-26
情况2 1-9
6.返回dp[nums.length]
测试用例:
0 前面不是1 或是2 : 100 ,130 返回0
123 dp=[1,1,2,3]
1 2 3
dp{123} =dp{ 12[3]} +dp{1[23]}
dp{12} +dp{1}
dp{1[2]} +dp{[12]} 1
dp[1]+1
"""
class Solution:
def solve(self , nums: str) -> int:
# write code here
if nums =="0":
return 0
if nums =="10" or nums =="20":
return 1
for i in range(1,len(nums)):
if nums[i]=="0" and (nums [i-1]!="1" and nums[ i-1]!="2"):
return 0
dp=[1]*(len(nums)+1) # 初始化为1
for i in range(2,len(nums)+1):
if (nums[i-2]=='1' and nums[i-1]!='0' ) or (nums[i-2] =='2' and nums[i-1]>'0' and nums[i-1]<'7' ) : # 11 -19 ,21 -26
dp[i]=dp[i-1]+dp[i-2]
else:
dp[i]=dp[i-1]
print(dp)
return dp[-1]