題目
給定一個數字,我們按照如下規則把它翻譯爲字符串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。一個數字可能有多個翻譯。請編程實現一個函數,用來計算一個數字有多少種不同的翻譯方法。
示例 1:
輸入: 12258
輸出: 5
解釋: 12258有5種不同的翻譯,分別是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:
0 <= num < 2^31
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
基本思想
看了評論才發現這是個青蛙跳臺階的題目,只不過在跳兩階臺階時有些限制
青蛙跳臺階,遞歸
class Solution {
public:
int translateNum(int num) {
string str = to_string(num);
return fun(str);
}
int fun(string str){
if(str.length() < 2)
return 1;
else if(str.length() == 2){
int n = atoi(str.c_str());
if(n >= 10 && n < 26)
return 2;
else
return 1;
}
else{
int front = atoi(str.substr(0, 2).c_str());
if(front >= 10 && front < 26)
return fun(str.substr(1, str.length() - 1)) + fun(str.substr(2, str.length() - 2));
else
return fun(str.substr(1, str.length() - 1));
}
}
};
動態規劃
- dp[i]:以當前字符結束有多少種翻譯方法
- 狀態:字符
- 選擇:當前字符和前面一個字符能否合併
- 轉移方程:能合併dp[i] = dp[i - 1] + dp[i - 2];不能合併dp[i] = dp[i - 1]
class Solution {
public:
int translateNum(int num) {
string str = to_string(num);
return fun(str);
}
int fun(string str){
//動態規劃
vector<int> dp(str.length() + 1);
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= str.length(); ++i){
int cur = (str[i - 2] - '0') * 10 + str[i - 1] - '0';
dp[i] = dp[i - 1];
if(cur > 9 && cur < 26)
dp[i] += dp[i - 2];
//cout << dp[i] << endl;
}
return dp[str.length()];
}
};