解题思路:
动态规划
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