思路:

  1. 特殊场景处理:
  • 如果存在0之前的字符不是1或2:解码失败,返回0
  • 如果字符为0:解码失败,返回0
  • 如果字符为10或20:无法解码,返回1
  1. 创建一个N个元素的一维数组,存储各到各字符串的情况数量,初始值为1
  2. 字符串长度>2时:
  • int(str(i-1) + str(i)) 在11-19或21-26:f(i) = f(i-1) + f(i-2)
  • 其它(除特殊场景):f(i) = f(i-1)
  1. 为使f(i-1)、f(i-2)有值,在步骤3之前确定数组第2个元素的值
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 解码
# @param nums string字符串 数字串
# @return int整型
#
"""
示例:
输入:[3, 1, 7, 1, 7, 1, 2, 6,    2, 4, 1, 5, 4, 1, 7, 1, 7]
输出:[1, 1, 2, 2, 4, 4, 8, 12,   12, 24, 24, 48, 48, 48, 96, 96, 192 ]
"""
class Solution:
    def solve(self , nums: str) -> int:
        # 1.对0的特殊场景做处理
        # 为0时无法编译,返回0
        if nums == '0':
            return 0
        # 字符串长度为2:且值为10或20时,无法解码,返回1
        elif nums == '10' or nums == '20':
            return 1
        # 当任意0之前的字符不是1或2时,无法解码
        for i in range(len(nums)):
            if nums[i] == '0':
                if nums[i - 1] != '1' and nums[i - 1] != '2':
                    return 0
        # 2.初始化dp数组和数据   
        # 创建一个N个元素的一维数组,初始值为1,用于存放到每位字符的解码情况
        dp = [1 for i in range(len(nums))]
        
        # 3.确定dp数组的第2个元素值
        # 字符串长度大于等于2:确定第,如果满足11-19或21-26,值更新为2
        temp = int(nums[0:2])
        if (temp >= 11 and temp <= 19) or (temp >=21 and temp <= 26):
            dp[1] = 2
        
        # 4.计算dp数组第3个开始的元素值
        # 当字符串长度大于等于3时,开始遍历      
        for i in range(2, len(nums)):
            temp = int(nums[i-1:i+1])
            # 4-1.如果i与前一个字符组成的数字在11-19、21-26之间,则可以进行拆解
            if (temp >= 11 and temp <= 19) or (temp >=21 and temp <= 26):
                dp[i] = dp[i - 1] + dp[i - 2]
            # 4-2.如果i与前一个字符组成的数字为10或20,则不可以对i和i-1个元素做拆解,dp[i]值回退到上上个元素的场景值
            elif temp == 10 or temp == 20:
                dp[i] = dp[i - 2]
            # 4-3.如果i与前一个字符组成的数字小于10或大于26,则只能按单个字符组合,无新增场景数量
            else:
                dp[i] = dp[i -1]
        return dp[-1]
            

以下为删掉注释后的代码:

class Solution:
    def solve(self , nums: str) -> int:
        if nums == '0':
            return 0
        elif nums == '10' or nums == '20':
            return 1
        for i in range(len(nums)):
            if nums[i] == '0':
                if nums[i - 1] != '1' and nums[i - 1] != '2':
                    return 0
                
        dp = [1 for i in range(len(nums))]
        
        temp = int(nums[0:2])
        if (temp >= 11 and temp <= 19) or (temp >=21 and temp <= 26):
            dp[1] = 2
        
        for i in range(2, len(nums)):
            temp = int(nums[i-1:i+1])
            if (temp >= 11 and temp <= 19) or (temp >=21 and temp <= 26):
                dp[i] = dp[i - 1] + dp[i - 2]
            elif temp == 10 or temp == 20:
                dp[i] = dp[i - 2]
            else:
                dp[i] = dp[i -1]
        return dp[-1]