給定乙個數字,我們按照如下規則把它翻譯為字串:0 翻譯成 「a」 ,1 翻譯成 「b」,……,11 翻譯成 「l」,……,25 翻譯成示例 1:「z」。乙個數字可能有多個翻譯。請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。
輸入:
12258
輸出:5
解釋:12258有5種不同的翻譯,分別是"bccfi"
,"bwfi"
,"bczi"
,"mcfi"和"mzi"
解法一:深搜使用dfs進行解題,每次嘗試讀取一位或者兩位數字進行翻譯,形成的遞迴樹每乙個節點有兩個分支。
解法二:動態規劃
使用動態規劃的解法,dp[i]dp[i] 代表以第i位數為結尾的數字的翻譯方案數量。
解法二參考文章:
動態規劃
解法一:
private
static
int count;
public
static
inttranslatenum
(int num)
private
static
void
dfs(string str,
int index)
//讀取一位進行翻譯
dfs(str, index+1)
;//讀取兩位進行翻譯
if(index+
2<=str.
length()
&&"10"
.compareto
(str.
substring
(index, index+2)
)<=0&&
"26"
.compareto
(str.
substring
(index, index+2)
)>0)
}
解法二:
public
inttranslatenum2
(int num)
return dp[s.
length()];}
提交結果:
劍指 Offer 46 把數字成字串
以12256為例從左邊開始翻譯可以分為兩個子問題 翻譯1,2256,翻譯12,256 2256可以分解為翻譯2,256 22,56。256可以分解為翻譯2,56。由上分析可以使用遞迴求解但是存在重複部分 56 所以考慮由下至上解決問題,這樣可以消除子問題假設f i f i f i 是第i個數開始存在...
劍指Offer系列之題46 題50
目錄從撲克牌隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2 10為數字本身,a為1,j為11,q為12,k為13,而大 小王可以看成任意數字。找出最大最小值,0的數量,判斷最大最小值的差中的空缺數是否小於等於0的個數 1.快排 快排超時,使用arrays.sort numbers pu...
劍指offer 第15 16題
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。coding utf 8 classsolution defnumberof1 self,n write code here count 0 ifn 0 n n 0xffffffff whilen count 1 n n 1 n re...