【剑指offer】JZ46 把数字翻译成字符串

1 问题

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

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

数据范围:字符串长度满足 0<n≤90
进阶:空间复杂度 O(n),时间复杂度 O(n)

示例1
输入:“12”
返回值:2
说明:2种可能的译码结果(”ab” 或”l”)

示例2
输入:“31717126241541717”
返回值:192
说明:192种可能的译码结果

2 答案

这题直接不会,没有想清楚状态转移方程

官方解,动态规划

对于普通数组1-9,译码方式只有一种,但是对于11-19,21-26,译码方式有可选择的两种方案,因此我们使用动态规划将两种方案累计。

  • step 1:用辅助数组dp表示前i个数的译码方法有多少种。
  • step 2:对于一个数,我们可以直接译码它,也可以将其与前面的1或者2组合起来译码:如果直接译码,则dp[i]=dp[i−1];如果组合译码,则dp[i]=dp[i−2]。
  • step 3:对于只有一种译码方式的,选上种dp[i−1]即可,对于满足两种译码方式(10,20不能)则是dp[i−1]+dp[i−2]
  • step 4:依次相加,最后的dp[length]即为所求答案。
class Solution:
    def solve(self , nums: str) -> int:
        if nums == "0":
            return 0
        if nums == "10" or nums == "20":
            return 1
        for i in range(1, len(nums)):
            if nums[i] == '0':
                if nums[i-1] != '1' and nums[i-1] != '2':
                    return 0
        dp = [1 for _ in range(len(nums) + 1)]
        for i in range(2, len(nums)+1):
            if (nums[i-2] == '1' and nums[i-1] > '0') or (nums[i-2] == '2' and nums[i-1] > '0' and nums[i-1] < '7'):
                dp[i] = dp[i-1] + dp[i-2]
            else:
                dp[i] = dp[i-1]
        return dp[len(nums)]

https://www.nowcoder.com/share/jump/9318638301699334607310

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LouHerGetUp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值