原题地址: https://leetcode-cn.com/probl...python
给定一个数字,咱们按照以下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不一样的翻译方法。git
示例 1:github
输入: 12258
输出: 5
解释: 12258 有 5 种不一样的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"编程
提示:数组
0 <= num < 231函数
咱们另 f(n)表示给定数字 num 的状况下,从 num 的第 1 位(包含)到第 n 位(包含)有多少种不一样的翻译方法。优化
咱们从几个简单的例子入手,尝试打开思路。spa
对于数字 12258 来讲:翻译
| (挡板)表示从这里分开翻译, ,(逗号)表示分割多个翻译方式。
其实对于 f(3) 来讲, 我手动的状况下,是这么想的:code
那么总的状况就是三种。OK,总结下个人逻辑:
用图来表示:
所以,实际上这道题就是爬楼梯的换皮题。
class Solution: def translateNum(self, num: int) -> int: @lru_cache def helper(s: str) -> int: if not s: return 1 pre = helper(s[:-1]) if 10 <= int(s[-2:]) <= 25: return pre + helper(s[:-2]) return pre return helper(str(num))
复杂度分析
若是你愿意的话,其实优化起来也比较简单,咱们只须要 bottom-up 便可。
class Solution: def translateNum(self, num: int) -> int: s = str(num) n = len(s) dp = [1] * n for i in range(1, n): dp[i] = dp[i - 1] if 10 <= int(s[i - 1:i + 1]) <= 25: dp[i] += dp[i - 2] return dp[-1]
进而能够优化到空间 $O(1)$
class Solution: def translateNum(self, num: int) -> int: s = str(num) n = len(s) a = b = 1 for i in range(1, n): if 10 <= int(s[i - 1:i + 1]) <= 25: temp = a a = b b = temp + b else: a = b return b
更多题解能够访问个人 LeetCode 题解仓库:https://github.com/azl3979858... 。 目前已经 30K star 啦。
你们也能够关注个人公众号《力扣加加》获取更多更新鲜的 LeetCode 题解