劍指offer第46題 把數字翻譯成字串

2021-10-25 05:56:49 字數 1328 閱讀 7944

給定乙個數字,我們按照如下規則把它翻譯為字串:0 翻譯成 「a」 ,1 翻譯成 「b」,……,11 翻譯成 「l」,……,25 翻譯成

「z」。乙個數字可能有多個翻譯。請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。

示例 1:

輸入:

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...