首页 > 试题广场 >

把数字翻译成字符串

[编程题]把数字翻译成字符串
  • 热度指数:154027 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

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

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

数据范围:字符串长度满足 0 < n \leq 90
进阶:空间复杂度 ,时间复杂度
示例1

输入

"12"

输出

2

说明

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

输入

"31717126241541717"

输出

192

说明

192种可能的译码结果  

结合1楼和1楼的评论,如果是10和20结尾,应该返回a的数量,比如110,120只有1种翻译,而不是2种。

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 解码
# @param nums string字符串 数字串
# @return int整型
#
class Solution:
    def solve(self , nums: str) -> int:
        # write code here
        if not nums or nums== '0':
            return 0
        a = b = 1  # a f(i-2) b f(i-1)
        for i in range(1,len(nums)):
            tmp = nums[i-1:i+1]
            if tmp == '00'or (tmp >= "30" and tmp[-1] == "0"):   # 如果有00连续则无法翻译 返回0
                return 0
            # 有0的如 10 20看成可翻译的一个数,而不是两个数的情况
            # c = a + b if '11' <= tmp <= '26' and '0' not in tmp else b 
            if tmp=='10' or tmp=='20': 
                c = a
            else:
                c = a + b if '11' <= tmp <= '26' else b 
            a, b = b, c
        return b
编辑于 2024-03-15 22:37:07 回复(0)
class Solution:
    def solve(self , nums: str) -> int:
        # write code here
        n = len(nums)
        dp = [0] * (n+1)
        dp[0] = 1
        dp[1] = 1 if nums[0] != '0' else 0
        print(dp)
        for i in range(2, n+1):
            if nums[i-1] != '0':
                dp[i] += dp[i-1]
            if '10'<= nums[i-2:i] <= '26':
                dp[i] += dp[i-2]
        return dp[n]

发表于 2023-04-10 17:36:45 回复(0)
class Solution:
    def solve(self , nums: str) -> int:
        # write code here
        # 相较于从“0”开始对应字母“a”,本题需多考虑对nums中出现的”0“的处理
        # 题目已保证nums不为空,再排除一下开头即无法编译的情况
        if nums[0] == '0':
            return 0
        #开始dp,dp[i]指nums[:i+1]的可能译码结果
        dp = [1 for _ in range(len(nums))]
        for i in range(1, len(nums)):
            if nums[i] == '0':  # 0单独无意义,必须与nums之前的数字凑出字母对应,否则翻译失败
                if (nums[i-1] == '0') or (int(nums[i-1: i+1]) > 26):  # 前一个数字不是1或者2,都翻译失败
                    return 0
                else: #  能翻了,但只能绑着前一个数字一起翻
                    dp[i] = dp[i-2]
            elif (nums[i-1] == '0') or (int(nums[i-1: i+1]) > 26):  # 绑起来翻不了,只能单独翻
                dp[i] = dp[i-1]
            else:  # 既能绑起来翻,也能单独翻
                dp[i] = dp[i-1] + dp[i-2]
        返回最后结果
        return dp[-1]
可理解为跳台阶,梯面写着数字,有时候只能跳一级,有时候只能两级并着跳,有时候既能跳一级也能上两级
发表于 2023-03-20 15:09:06 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 解码
# @param nums string字符串 数字串
# @return int整型
#
class Solution:
    def solve(self , nums: str) -> int:
        if len(nums) == 0&nbs***bsp;nums[0] == '0':
            return 0
        ret, s1, s2 = 1, 1, 1
        last = 3
        for i in nums:
            s2, s1 = s1, ret
            if int(i) == 0:
                if last > 2&nbs***bsp;last == 0:
                    return 0
                ret = s2
            elif last == 0:
                ret = s2
            elif last * 10 + int(i) > 26:
                ret = s1
            else:
                ret = s1 + s2
            last = int(i)
        return ret

发表于 2022-09-21 23:33:43 回复(0)
class Solution:
    def solve(self , nums: str) -> int:
        # write code here
        if not nums&nbs***bsp;nums== '0':
            return 0
        a = b = 1  # a f(i-2) b f(i-1)
        for i in range(1,len(nums)):
            tmp = nums[i-1:i+1]
            if tmp == '00':   # 如果有00连续则无法翻译 返回0
                return 0
            # 有0的如 10 20看成可翻译的一个数,而不是两个数的情况
            # c = a + b if '11' <= tmp <= '26' and '0' not in tmp else b 
            c = a + b if '11' <= tmp <= '26' and tmp != '20' else b 
            a, b = b, c
        return b
有条件的青蛙跳, 不仅是11 到 26 还要对0进行处理
发表于 2021-12-17 11:02:45 回复(2)