給定乙個數字,按照如下規則翻譯成字串:0翻譯成「a」,1翻譯成「b」…25翻譯成「z」。乙個數字有多種翻譯可能,例如12258一共有5種,分別是bccfi,bwfi,bczi,mcfi,mzi。實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。
分析思路:
用遞迴自頂向下分析,用動態規劃自低向上求解
•定義問題:當最開始的乙個或者兩個數字被翻譯成乙個字元後,我們接著翻譯後面剩下的數字;
•用乙個遞迴式來表示:定義f(i)表示從第i位數字開始的不同翻譯的數目,那麼f(i) = f(i+1) + g(i,i+1)*f(i+2);當第i位和第i+1位兩位數字拼接起來的數字在10~25的範圍內時,函式g(i,i+1)的值為1,否則為0。
•該問題使用上面的遞迴方法會存在很多重複子問題。以12258為例,翻譯12258可以分解為兩個子問題:翻譯1和2258,以及翻譯12和258。接下來我們翻譯第乙個問題中剩下的2258,同樣也可以分解成兩個子問題,翻譯2和258,以及翻譯22和58.注意到子問題翻譯258重複出現了。
所以我們使用動態規劃的方法,自低向上求解問題,消除重複子問題。
package jianzhioffer;
/* * 面試題46:把數字翻譯成字串
* 題目:給定乙個數字,我們按照如下規則把它翻譯成字串:0翻譯成a,1翻譯成b,。。。,
* 11翻譯成l,。。。,25翻譯成z。乙個數字可能有多個翻譯。例如,12258有5種不同的翻譯,
* 分別是bccfi,bwfi,bczi,mufi,mzi。請程式設計實現乙個函式,用來計算乙個數字有多少種
* 不同的翻譯方法。
*/public
class
demo46
system.out.
println
(f[1])
;}public
static
intg
(string str,
int i)
}
leetcode 面試題46把數字翻譯成字串
解題思路 動態規劃,1 得到num的每一位數字,從低位到高位用nums儲存 2 從低位到高位依次求解,狀態轉移方程如下 d p i dp i 1 dp i 2 10 leq nums i 10 nums i 1 26 dp i 1 others end right.dp i dp i 1 dp i ...
leetcode面試題46把數字翻譯成字串
題目描述 給定乙個數字,我們按照如下規則把它翻譯為字串 0 翻譯成 a 1 翻譯成 b 11 翻譯成 l 25 翻譯成 z 乙個數字可能有多個翻譯。請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。示例 1 輸入 12258 輸出 5 解釋 12258有5種不同的翻譯,分別是 bccf...
leetcode 面試題46 把數字翻譯成字串
題目鏈結 給定乙個數字,我們按照如下規則把它翻譯為字串 0 翻譯成 a 1 翻譯成 b 11 翻譯成 l 25 翻譯成 z 乙個數字可能有多個翻譯。請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。class solution vector int nums while num int...