劍指offer:把數字翻譯成字符串

題目要求:
給定一個數字,按照以下規則翻譯成字符串: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))
相關文章
相關標籤/搜索