数字字符串转化为字母组合的种数
題目
給定一個字符串str,str全部由數字字符組成,如果str中某一個或者某相鄰兩個字符組成的子串在1~26之間,則這個子串可以轉換為一個字母。規定“1”轉換為“A”,“2”轉換為“B”……“26”轉換為“Z”。求str有多少種不同的轉換結果。
舉例
str = “1111”?
能轉換成的結果有“AAAA”,“LAA”,“ALA”,“AAL”和“LL”,返回5。?
str = “01”,“0”沒有對應的字母,返回0。
基本思路
1.暴力遞歸的方法。定義遞歸函數p(i),p(i)表示只轉換字符串的i~N-1部分(N表示字符串的長度),一共有多少種轉換結果。接下來便可以進行遞歸求解:
如果i == N,p(N)表示沒有任何字符需要轉換,返回 1。
如果str[i] == ‘0’,因為以0開頭的子串都能進行轉換,所以返回 0。
如果不滿足條件1和2,說明此時str[i]在 ‘1’ 到 ‘9’ 之間,這個時候str[i]能轉換的種數至少包含p(i+1)。如果str[i]和str[i+1]的組合又在 ‘10’ 到 ‘26’ 之間,則str[i]能轉換的種數還要包含p(i+2),即p(i) = p(i+1) 或者p(i) = p(i+1) + p(i+2)。
2.動態規劃的方法。由上述可知,p(i)的值最多依賴于p(i+1)和p(i+2),即p(i) = p(i+1) (+ p(i+2)),這就是典型的斐波那契問題的變形題,只不過這里是從后往前計算而已。
?
?
?
總結
以上是生活随笔為你收集整理的数字字符串转化为字母组合的种数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 龙与地下城游戏问题
- 下一篇: 数组中两个字符串的最小距离