思路:
- 特殊场景处理:
- 如果存在0之前的字符不是1或2:解码失败,返回0
- 如果字符为0:解码失败,返回0
- 如果字符为10或20:无法解码,返回1
- 创建一个N个元素的一维数组,存储各到各字符串的情况数量,初始值为1
- 字符串长度>2时:
- int(str(i-1) + str(i)) 在11-19或21-26:f(i) = f(i-1) + f(i-2)
- 其它(除特殊场景):f(i) = f(i-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]