題目要求:
給定一個數字,按照以下規則翻譯成字符串:0翻譯成「a」,1翻譯成「b」...25翻譯成「z」。一個數字有多種翻譯可能,例如12258一共有5種,分別是bccfi,bwfi,bczi,mcfi,mzi。實現一個函數,用來計算一個數字有多少種不一樣的翻譯方法。git
# -*- coding: utf-8 -*- # @Time : 2019-07-10 21:13 # @Author : Jayce Wong # @ProjectName : job # @FileName : getTranslationCount.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : https://github.com/SysuJayce def getTranslationCount(number): """ 要將一個數字轉化成一個字符串,因爲這個數字有不少位,咱們最直觀的就是從頭開始,一位一位地去轉化。 好比給定12258. 咱們能夠先把1翻譯成b,而後剩下2258;也能夠先把12翻譯成m,而後剩下258.。。 因而可知是一個遞歸問題,用遞歸的思路分析題目,用循環來解決問題(動態規劃) 遞推公式爲:f(i) = f(i+1) + g(i, i+1) x f(i+2) 其中f(i)表示到下標爲i的數字爲止,共有多少種可能的翻譯。之因此寫成向前遞推的公式,是由於若是我 們從前日後翻譯,會出現不少重複的子問題,好比12258=1 | 2258,其中2258=2 | 258,而12258=12 | 258, 這樣258就重複了。 因此咱們從後往前翻譯,就能夠避免這樣的重複子問題。 """ def helper(s): # 一個數字至少有一種翻譯,所以能夠先設置一個全爲1的數組,長度對應數字的位數加一 counts = [1] * (len(s) + 1) # 對於前面的n-1位 for i in range(len(s) - 2, -1, -1): # 第i位至少有和第i+1位同樣多的翻譯數 count = counts[i + 1] # 若是第i位和第i+1位能夠組合成一個10-25的數字,那麼g(i, i+1) = 1 # f(i) = f(i+1) + g(i, i+1) x f(i+2) # 因爲咱們設置的數組長度是位數+1,所以這裏i+2不可能越界 if 10 <= int(s[i: i + 2]) <= 25: count += counts[i + 2] counts[i] = count return counts[0] # 因爲0對應a,25對應z,所以小於0的輸入是無效的 if number < 0: return 0 return helper(str(number))