【劍指offer】46、把數字翻譯成字符串


題目

給定一個數字,按照如下規則翻譯成字符串:

0->a

1->b

...

25->z

因此一個數字可能有多種翻譯。例如,12258有5種不同的翻譯,bccfi,bwfi,bczi,mcfi,mzi。

請實現一個函數,計算數字有多少種翻譯方法。

思路

可以用遞歸解決,會發現子問題258 58都重復了。

 

自然想到可以用動態規划來解決,用f(i)來表示從第i位數字開始不同的翻譯數目,

我們可以寫出轉移矩陣

g(i,i+1)表示第i位和i+1位拼起來的數字在10~25范圍內,值為1,否則為0。

先f(5) = 1, f(4) = 1

f(3) = f(4) + 0 = 1

f(2) = f(3) + f(4) = 2

f(1) = f(2) + f(3) = 3

f(0) = f(1) + f(2) = 5 

int GetTranslationCount(int number){
    if (number < 0)
        return 0;
    string numberString = to_string(number);
    return GetTranslationCount(numberString);
}

int GetTranslationCount(const string& number){
    int length = number.length();
    int* f = new int[length];
    int count = 0;

    for (int i = length - 1; i >= 0; i++){
        count = 0;
        i < length - 1 ? count = f[i + 1] : count = 1;
        if (i < length - 1)
        {
            int digit1 = number[i] - '0';
            int digit2 = number[i + 1] - '0';
            int converted = digit1 * 10 + digit2;
            if (converted >= 10 && converted <= 25){
                i < length - 2 ? count += f[i + 2] : count += 1;
            }
        }
        f[i] = count;
    }
    count = f[0];
    delete[] f;

    return count;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM