#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 解码
# @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]