原題地址: 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 題解