解题思路:
动态规划
1.dp[i]定义
字符串 nums[0-i] 的可能的译码结果
2.状态转移方程
(i>=2)
(a)后两个字符11-19,21-26时,dp[i] = dp[i-1] + dp[i-2]
(b)当前字符1-9时,后两个字符10或20时,dp[i] = dp[i-1]
(c)其它情况 dp[i] = 0
3.边界
(i==0)
首字符1-9时,dp[0] = 1
首字符为0时,dp[0] = 0,直接返回
(i==1)
(a)后两个字符11-19,21-26时,dp[i] = 2
(b)当前字符1-9时,后两个字符10或20时,dp[i] = 1
(c)其它情况 dp[i] = 0
#=============================================================================================
'''
#
# 解码
# @param nums string字符串 数字串
# @return int整型
#
class Solution:
def solve(self , nums ):
# write code here
n = len(nums)
#print('nums=',nums)
#print('n=',n)
if n==0:
return 0
dp = [0]*n
for i in range(n):
if i==0:
if 1<=int(nums[i])<=9:
dp[i] = 1
else:
dp[i] = 0
return 0
elif i==1:
if 11<=int(nums[i-1:i+1])<=19 or 21<=int(nums[i-1:i+1])<=26:
dp[i] = 2
elif 1<=int(nums[i])<=9 or int(nums[i-1:i+1])==10 or int(nums[i-1:i+1])==20:
dp[i] = 1
else:
dp[i] = 0
else:
if 11<=int(nums[i-1:i+1])<=19 or 21<=int(nums[i-1:i+1])<=26:
dp[i] = dp[i-1] + dp[i-2]
elif 1<=int(nums[i])<=9 or int(nums[i-1:i+1])==10 or int(nums[i-1:i+1])==20:
dp[i] = dp[i-1]
else:
dp[i] = 0
#print(dp)
return dp[-1]
print(Solution().solve('31717126241541717')) # 192