給定一個數字,我們按照如下規則把它翻譯爲字符串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。一個數字可能有多個翻譯。請編程實現一個函數,用來計算一個數字有多少種不同的翻譯方法。
示例1:
輸入: 12258
輸出: 5
解釋: 12258有5種不同的翻譯,分別是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:
0 <= num <
思路:這題要說簡單也挺簡單的,看翻譯的規則知道每次翻譯的步數是1或者2,如果是2的話翻譯數n必須滿足0<=n<26,很明顯是一道動態規劃題目,和爬樓梯相比就多了一個限制條件。動態規劃方程如下(借用下官方的):
一開始思路有些拋錨,寫成了
因爲是1變成了2,想的是之前的選擇數加倍,現在看起來傻乎乎的。
復現的思路是用遞歸的方式,而不是轉換成字符串數組,感覺沒必要,用除100取餘的方式判斷餘數否滿足0<=n<26, 如果是下一步爲,否則就是,一直到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);
}
};
運行結果: