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