1,題目:
2,思路:
動態規劃:
dp[i]
=+xi 屬於[10,
25]dp[i−1
]10x
+xi 屬於[1,
10) 並上(25,
99]
方法一:字串遍歷(動態規劃)(從左向右遍歷):方法二:字串遍歷(動態規劃)(從左向右遍歷):此題的動態規劃計算是 對稱的 ,即 從左向右遍歷(從第 dp[2]計算至 dp[n]) 和 從右向左遍歷(從第 dp[n−2] 計算至 dp[0]),所得方案數一致。
方法三:深度優先搜尋:
3,**:
class
solution
組成的兩位數字可以被翻譯,則dp[i]=dp[i−1]+dp[i−2] ;否則 dp[i]=dp[i−1] 。
可被翻譯的兩位數區間:當 x = 0時,組成的兩位數是無法被翻譯的(例如 00,01,02,⋯ ),因此區間為 [10, 25][10,25] 。
dp[i]=+xi 屬於[10,25]
dp[i−1] 10x+xi 屬於[1,10) 並上(25,99]
3,初始狀態:dp[0]=dp[1]=1 ,即 「無數字」 和 「第 1位數字」 的翻譯方法數量均為 1;
4,返回值: dp[n],即此數字的翻譯方案數量。
*//*方法一:字串遍歷(動態規劃)(從左向右遍歷)
為方便獲取數字的各位 xi,考慮先將數字 num轉化為字串 s ,通過遍歷 s實現動態規劃。
通過字串切片 s[i−2:i] 獲取數字組合 10x+xi,通過對比字串 ascii 碼判斷字串對應的數字區間。
*/string s = string.
valueof
(num)
;int a =
1, b =1;
//這是初始化,因為剛開始的空格和乙個字元的肯定只有一種結果
for(
int i =
2; i <= s.
length()
; i++
)return a;
}}
方法二:字串遍歷(動態規劃)(從右向左遍歷)
/*
此題的動態規劃計算是 對稱的 ,即 從左向右遍歷(從第 dp[2]計算至 dp[n]) 和 從右向左遍歷(從第 dp[n−2] 計算至 dp[0]),所得方案數一致。
*/class
solution
return a;
}}
方法三:深度優先搜尋:
//深度優先搜尋
class
solution
dfs(str, n +1)
;if(str.
charat
(n)-
'0'>
0&& n +
1< str.
length()
&&(str.
charat
(n)-
'0')*10
+ str.
charat
(n +1)
-'0'
<26)
}public
inttranslatenum
(int num)
}
劍指 46 把數字翻譯成字串
題目描述 演算法分析 f r 表示以r為開始 r最小取0 到最右端所組成的數字能夠翻譯成字串的種數。對於長度為n的數字,f n 0,f n 1 1,求f 0 遞推公式為 f r 2 f r 1 g r 2,r 1 f r 其中,如果r 2,r 1能夠翻譯成字元,則g r 2,r 1 1,否則為0。因...
劍指offer c 把數字翻譯成字串
題目 給定乙個數字,按照如下規則翻譯成字串 0翻譯成 a 1翻譯成 b 25翻譯成 z 乙個數字有多種翻譯可能,例如12258一共有5種,分別是bccfi,bwfi,bczi,mcfi,mzi。實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。題目解析 這是一道典型的dp題目。1.分析其是否為d...
劍指 Offer把數字翻譯成字串
給定乙個數字,我們按照如下規則把它翻譯為字串 0 翻譯成 a 1 翻譯成 b 11 翻譯成 l 25 翻譯成 z 乙個數字可能有多個翻譯。請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。示例 1 輸入 12258 輸出 5 解釋 12258有5種不同的翻譯,分別是 bccfi bwf...