【动态规划-BM69 把数字翻译成字符串】

题目

BM69 把数字翻译成字符串

描述
有一种将字母编码成数字的方式:‘a’->1, ‘b->2’, … , ‘z->26’。

现在给一串数字,返回有多少种可能的译码结果

在这里插入图片描述

分析

  1. 特判一个‘0’的情况

  2. 后面可以用动态规划:
    dp[n]为考虑前n个字符时,对应的转译数量

  3. 转移过程:
    前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]
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值