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