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

题目

给定一个数字,我们按照如下规则把它翻译为字符串: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. 把数字翻译成字符串)