2020-06-09 LeetCode 面試題46 把數字翻譯成字符串 C++

題目:面試題46. 把數字翻譯成字符串

  給定一個數字,我們按照如下規則把它翻譯爲字符串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。一個數字可能有多個翻譯。請編程實現一個函數,用來計算一個數字有多少種不同的翻譯方法。

示例1:

輸入: 12258
輸出: 5
解釋: 12258有5種不同的翻譯,分別是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

提示:

  0 <= num < 2312^{31}

  思路:這題要說簡單也挺簡單的,看翻譯的規則知道每次翻譯的步數是1或者2,如果是2的話翻譯數n必須滿足0<=n<26,很明顯是一道動態規劃題目,和爬樓梯相比就多了一個限制條件。動態規劃方程如下(借用下官方的):
f(i)=f(i1)+f(i2)[i10,10x25] f(i)=f(i−1)+f(i−2)[i−1≥0,10≤x≤25]

一開始思路有些拋錨,寫成了
f(i)=f(i1)+2×f(i2)[i10,10x25] f(i)=f(i−1)+2\times f(i−2)[i−1≥0,10≤x≤25]
  因爲是1變成了2,想的是之前的選擇數加倍,現在看起來傻乎乎的。

  復現的思路是用遞歸的方式,而不是轉換成字符串數組,感覺沒必要,用除100取餘的方式判斷餘數否滿足0<=n<26, 如果是下一步爲f(i)=f(i1)+f(i2)f(i)=f(i−1)+f(i−2),否則就是f(i)=f(i1)f(i)=f(i−1),一直到num除爲0爲止。

代碼如下:

class Solution {
public:
    int translateNum(int num) {
        if(num%100>9&&num%100<26)
            return translateNum(num/10)+translateNum(num/100);
        else
            return num==0?1:translateNum(num/10);
    }
};

運行結果:
2020-06-09_093836

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