給定一個數字,我們按照如下規則把它翻譯爲字符串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。一個數字可能有多個翻譯。請編程實現一個函數,用來計算一個數字有多少種不同的翻譯方法。
示例 1:
輸入: 12258
輸出: 5
解釋: 12258有5種不同的翻譯,分別是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:
0 <= num < 231
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
如果用動態規劃的思想思考這問題可以發現這就是一個典型的dp問題,有i個字符時,如果他與i-1能組成10-25數字,則相當於f[i-2]的情況,如果不能則相當於f[i-1]的情況。dp的思想就是將一個問題化簡成其子問題。所以可以給出狀態轉移方程:f[i] = f[i-1] + f[i-2]。這很好理解,條件就是 i >= 2並且組成的數在10-25之間。其他情況:比如i=1 時 f[i] = f[i-1] = f[0] = 1
我用Go實現:
func translateNum(num int) int {
src := strconv.Itoa(num)
p, q, r := 0, 0, 1
for i := 0; i < len(src); i++ {
p, q, r = q, r, 0 //滾動數組,因爲只會用到f[i-2],f[i-1],f[i]三位
r += q
if i == 0 {
continue
}
pre := src[i-1:i+1]
if pre <= "25" && pre >= "10" {
r += p
}
}
return r
}