JZ69 把數字翻譯爲字符串

把數字翻譯爲字符串

題目:給定一個數字,按照如下規則翻譯成字符串:0翻譯成“a”,1翻譯成“b”…25翻譯成“z”。一個數字有多種翻譯可能,例如12258一共有5種,分別是bccfi,bwfi,bczi,mcfi,mzi。實現一個函數,用來計算一個數字有多少種不同的翻譯方法。

思路:遞歸,遍歷數字的位,當前位翻譯一種方法,如果當前位和下一位能結合成另一種翻譯,則有可記錄爲一種方法。但是遞歸會找出重複計算,如12258會計算1,2258和12,258,而2258會2,258,我們定義f(i)表示從第i位數字開始的不同翻譯的數目,那麼f(i) = f(i + 1) + g(i,i + 1) * f(i + 2)。當第i位和第i + 1位兩位數字拼接起來的數字在10 ~ 25的範圍內時,函數g(i,i + 1)的值爲1,否則爲0.

有重複,可以使用動態規劃。從後往前求,比記錄翻譯方法數。

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
        r += q
        if i == 0 {
            continue
        }
        pre := src[i-1:i+1]
        if pre <= "25" && pre >= "10" {
            r += p
        }
    }
    return r
}

 

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