劍指Offer 46 把數字翻譯成字串

2022-03-06 11:25:09 字數 1275 閱讀 9279

劍指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為結尾的數字的翻譯方式。

這個問題可以分解為遞迴子問題,且分解的過程需要進行分類討論:

如果nn-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 ...