跳到主要内容

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

题目描述

做题链接:面试题46. 把数字翻译成字符串

解题思路

方法一:递归解法

本题用递推去解决非常方便,只是把各种情况递归解决就好

如 dfs(112) =>

  • 'a' 和 dfs(12)
  • 'I' 和 dfs(2)

方法二: 动态规划

参考: 这个教程

  • 动态规划-转移方程 $$ dp(i)=\left{ \begin{aligned} dp(i - 2) + dp(i - 1) , \quad & between \ 0..25 \dp(i - 1), \quad & else \end{aligned} \right. $$

    边界条件 $$ dp(0) = dp(1) = 1 $$

代码

代码一: 递归解法

class Solution:
def translateNum(self, num: int) -> int:
""" 递归解法 """
def dfs(s):
if s == "":
self.ret += 1
return
dfs(s[1:])
if len(s) > 1 and s[:2] >= '10' and s[:2]<="25": # 符合条件就继续向下
dfs(s[2:])
self.ret = 0
dfs(str(num))
return self.ret

代码二: 动态规划

class Solution:
def translateNum(self, num: int) -> int:
""" dp 表达式改写 """
s = str(num)
dp = [0] * (len(s) + 1)
dp[0] = dp[1] = 1 # dp 从 1 开始计数
for i in range(2, len(s) + 1):
if 10 <= int(s[i-2 : i]) <= 25: # s 从 0 开始计数
dp[i] = dp[i - 1] + dp[i - 2]
else:
dp[i] = dp[i - 1]
return dp[len(s)]