劍指offer
contents給定乙個數字,我們按照如下規則把它翻譯為字串:0 翻譯成 「a」 ,1 翻譯成 「b」,……,11 翻譯成 「l」,……,25 翻譯成 「z」。乙個數字可能有多個翻譯。請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。
示例 1:
輸入: 12258
輸出: 5
解釋: 12258有5種不同的翻譯,分別是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
0 <= num < 231
題意的核心在於,如果數字當中的某兩位組成的數字在10~25的範圍內,我們就有這兩位數字就會有兩種翻譯。例如12258當中的前2位,即12
,可以翻譯為
這是乙個遞迴問題。可以這樣理解,假設數字最後一位的索引是n
,遞迴問題就是recur(n)
,即求解以索引n
為結尾的數字的翻譯方式。
這個問題可以分解為遞迴子問題,且分解的過程需要進行分類討論:
如果n
和n-1
位置上的數字組合起來不在10~25範圍內:
我們通過遞迴的思維從上到下的分析問題,編寫**時,為了避免重複計算,可以從下到上地解決問題,即動態規劃,從dp[0]
開始計算,直到dp[n]
,就可以得到結果。
class
solution
//返回最後乙個元素
return dp[str.length()];}}
dp陣列與數字字串的對應關係注意dp的索引與字串的索引是相差1的。
dp[0]
的推導
當前兩位數字在10~25範圍內時,有dp[2] = dp[1] + dp[0]
,其中dp[2] = 2,dp[1] = 1
,所以dp[0] = 1
劍指offer 46 把數字翻譯成字串
給定乙個數字,我們按照如下規則把它翻譯為字串 0 翻譯成 a 1 翻譯成 b 11 翻譯成 l 25 翻譯成 z 乙個數字可能有多個翻譯。請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。示例 1 輸入 12258 輸出 5 解釋 12258有5種不同的翻譯,分別是 bccfi bwf...
劍指 Offer 46 把數字翻譯成字串
給定乙個數字,我們按照如下規則把它翻譯為字串 0 翻譯成 a 1 翻譯成 b 11 翻譯成 l 25 翻譯成 z 乙個數字可能有多個翻譯。請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。示例 1 輸入 12258 輸出 5 解釋 12258有5種不同的翻譯,分別是 bccfi bwf...
劍指 Offer 46 把數字翻譯成字串
方法 演算法思想 動態規劃,到i的時候,區分最後兩位 是不是 10,25 最後一位 其他情況 時間複雜度 o n 空間複雜度 o n 邊界條件 兩位的時候,有兩種情況,所以dp 1 補充知識 class solution public int translatenum int num string ...