Leetcode 46. 把數字翻譯成字符串

給定一個數字,我們按照如下規則把它翻譯爲字符串: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
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章