题目
描述
有一种将字母编码成数字的方式:‘a’->1, ‘b->2’, … , ‘z->26’。
现在给一串数字,返回有多少种可能的译码结果
分析
-
特判一个‘0’的情况
-
后面可以用动态规划:
dp[n]为考虑前n个字符时,对应的转译数量 -
转移过程:
前i个字符串的译码数量可以由前i-1个字符串的译码数量得到,这时只考虑第i个字符的使用情况:
默认第i个字符都可以单独转译(要判断s[i-1]为0的情况,如果前一个字符不是1或2则整个字符串无法转译)
单独转译则 dp[i] = dp[i-1]可以与前一个字符组合,则dp[i] = dp[i-1]+dp[i-2]
i 为1-6时,前一个字符为1或2都可
i 为7-9时,前一个字符需要为1
代码
class Solution:
def solve(self , nums: str) -> int:
# write code here
n = len(nums)
# 特判仅有‘0’的情况
if n == 1 and nums[0] == '0':
return 0
# 初始化,起作用的有dp[0],dp[1],都应该初始化为1
dp = [1]*(n+1)
for i in range(2,n+1):
# 提取当前字符对应的数字
t = int(nums[i-1])
# 默认能够单独转为字母
dp [i] = dp[i-1]
# 特判一下,当前为0,且不能与前一个组成10,20的情况
if t==0:
if nums[i-2] not in "12":
return 0
# 可以和前一个字母组合,则数量要加上dp[i-2]
# 11-16,21-26
if 0<t<=6:
if nums[i-2] in "12":
dp [i] += dp[i-2]
# 17-19
elif 6<t<=9:
if nums[i-2] == '1':
dp[i]+= dp[i-2]
return dp[n]