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

209 阅读1分钟

题目描述

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

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

解题思路: 动态规划

我们定义dp[i]为前i位元素可以组成多少种排列. 那么 dp[i] 有2种情况

  1. 如果i位的与i-1位不能组成一个小于26的两位数, 那么dp[i] = dp[i-1]
  2. 如果可以组成两位数, 那么 dp[i] = dp[i-2] + dp[i-1] 即可以选择组成2位数排列或者不组成两位数排列(与爬楼梯类似)

示例代码

def translateNum(self, num: int) -> int:
    s = str(num)
    n = len(s)
    dp = [1 for _ in range(n + 1)]

    for i in range(2, len(s) + 1):
        temp = s[i - 2]
        if temp == "1" or (temp == "2" and s[i - 1] < "6"):
            dp[i] = dp[i - 2] + dp[i - 1]
        else:
            dp[i] = dp[i - 1]
    return dp[len(s)]