美文网首页剑指offer
面试题46. 把数字翻译成字符串

面试题46. 把数字翻译成字符串

作者: 人一己千 | 来源:发表于2020-03-26 05:39 被阅读0次

    题目

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

    示例 1:

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

    提示:

    0 <= num < 231

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路

    普通的动态规划,每新加入一个字符,都可以考虑两种情况:

    1. 把这个数字当成独立的数字;
    2. 这个数字和前面一个数字组合。

    当这个数字是独立的数字,那就是n-1个数字的时候,不过每个样例后面加一个字符。
    当这个数字和前面的组合分为两种情况,一个是<= 26的时候,这种情况就和n-2个数字的情况一样了,如果>26那就没有了。

    代码

    由于每次计算只需要前两个数字,所以不需要数组。

    class Solution:
        def translateNum(self, num: int) -> int:
            # 最大是25
            # 动态规划读一个字还是读两个
            # f(i) = f(i-1)+f(i-2) 如果num[i-1:i+1]<26 else f(i-1)
            # dp = [0]*len(num)
            
            num = [int(i) for i in str(num)]
            dp0 = 1
            dp1 = 1
            for i in range(1,len(num)):
                if 9 < 10*num[i-1]+num[i] <26 :
                     dp1 = dp0 + dp1
                     dp0 = dp1 - dp0
                else:
                    dp0,dp1 = dp1,dp1
            return dp1
    

    相关文章

      网友评论

        本文标题:面试题46. 把数字翻译成字符串

        本文链接:https://www.haomeiwen.com/subject/qfizyhtx.html