給定一個數字,我們按照如下規則把它翻譯爲字符串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。一個數字可能有多個翻譯。請編程實現一個函數,用來計算一個數字有多少種不同的翻譯方法。
示例 1:
輸入: 12258
輸出: 5
解釋: 12258有5種不同的翻譯,分別是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
思路:
有一次倒在了動態規劃的問題上,一開始我把這個題目認爲是排列組合,最後發現我太天真了;既然DP那就是以第i個下標結尾的數字有多少種排列組合。以這個題目爲例子:
dp[0]=1 dp[1]=2 dp[2] =3 dp[3] =5 dp[4]=5
這個圖來自https://leetcode-cn.com/u/jyd/
看完這個分析結果就很清晰了,上代碼:
class Solution:
def translateNum(self, num: int) -> int:
num = str(num)
size = len(num)
if size==1:
return 1
dp = [0 for i in range(size)]
dp[0]=1
dp[1]=2 if int(num[0]+num[1])<26 else 1
for i in range(2,size):
number = int(num[i-1]+num[i])
if 9<number<26:
dp[i] = dp[i-1]+dp[i-2]
else:
dp[i] = dp[i-1]
return dp[-1]