这个题本身不难,状态转移方程也好写,主要麻烦的是0的存在。

设dp[i]为到第i个字符为止的数组共有多少中译码方式,于是状态转移方程如下:

dp[i+1]=dp[i],if nums[i1,i+1]>26 or nums[i+1]==0 or num[i]==0dp[i+1]=dp[i],if \ nums[i-1,i+1]>26 \ or \ nums[i+1]=='0' \ or \ num[i]=='0'

dp[i+1]=df[i]+dp[i1], if other casesdp[i+1]=df[i]+dp[i-1], \ if \ other \ cases

然后在注意下特殊情况,即100这种特殊的就行了,初始条件注意下就没问题了,代码如下:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 解码
# @param nums string字符串 数字串
# @return int整型
#
class Solution:
    def solve(self , nums: str) -> int:
        # write code here
        # 将nums中的不是1-9的字符全部删除
        # 初始化list存储dp
        if nums=='0':
            return 0
        leng = len(nums)
        if leng == 0:
            return 0
        dp = [1]*leng
        if leng == 1:
            return 1
        if int(nums[0:2])>26 or int(nums[0:2])==10:
            dp[1] = 1
        else:
            dp[1] = 2
        if leng == 2:
            return dp[1]
        if int(nums)%10 == 0:
            return 0
        else:
            for i in range(2 , leng):
                if int(nums[i-1:i+1])>26 or nums[i] == '0' or nums[i-1]=='0':
                    dp[i] = dp[i-1]
                else:
                    dp[i] = dp[i-1]+dp[i-2]
        return dp[-1]

nums = "31717126241541717"
print(Solution().solve(nums))