剑指 Offer 46 把数字翻译成字符串 NC116 把数字翻译成字符串

BM69 把数字翻译成字符串

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例 1:

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
 

提示:

0 <= num < 231

解题思路:

动态规划

力扣

Python代码:

class Solution:
    def translateNum(self, num: int) -> int:
        num = str(num)
        n = len(num)
        dp = [0] * (n + 1)
        dp[0] = dp[1] = 1
        for i in range(2, n + 1): 
            if '10' <= num[i - 2 : i] <= '25':
                dp[i] = dp[i - 1] + dp[i - 2]
            else:
                dp[i] = dp[i - 1]
        return dp[n]

描述

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

我们把一个字符串编码成一串数字,再考虑逆向编译成字符串。

由于没有分隔符,数字编码成字母可能有多种编译结果,例如 11 既可以看做是两个 'a' 也可以看做是一个 'k' 。但 10 只可能是 'j' ,因为 0 不能编译成任何结果。

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

数据范围:字符串长度满足 0<n≤90

进阶:空间复杂度 O(n),时间复杂度 O(n)

示例1

输入:

"12"

返回值:

2

说明:

2种可能的译码结果(”ab” 或”l”)     

示例2

输入:

"31717126241541717"

返回值:

192

说明:

192种可能的译码结果     

解题思路:

动态规划

题解 | #把数字翻译成字符串#_牛客博客

Pyhton代码:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 解码
# @param nums string字符串 数字串
# @return int整型
#
class Solution:
    def solve(self , nums: str) -> int:
        #排除0
        if nums == "0":  
            return 0
        #排除只有一种可能的10 和 20
        if nums == "10" or nums == "20":   
            return 1
        #当0的前面不是1或2时,无法译码,0种
        for i in range(1, len(nums)): 
            if nums[i] == '0':
                if nums[i - 1] != '1' and nums[i - 1] != '2':
                    return 0
        #辅助数组初始化为1
        dp = [1 for i in range(len(nums) + 1)]  
        for i in range(2, len(nums) + 1):
            #在11-19,21-26之间的情况
            if '11' <= nums[i-2: i] <= '19' or '21' <= nums[i-2: i] <= '26':
                dp[i] = dp[i - 1] + dp[i - 2]
            else:
                dp[i] = dp[i - 1]
        return dp[len(nums)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值