1、题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
提示:
0 <= num < 231
2、示例
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
3、题解
动态规划。
本题类比爬楼梯,dp[n] = dp[n-1]+dp[n-2]
dp[n]代表走到最后一个字符,能有多少多少种翻译方法
对于访问到当前的字符dp[n],能有多少种翻译?
1.当前字符翻译为1个字符这是一种方法,dp[n] = dp[n-1]
2.当前字符和前一个字符共同翻译为一种方法 dp[n]+=dp[n-2],此时的条件为前后两个字符可以翻译为同一个字符。
3.还有 04,05,06,这种只能翻译为1种,其组合不能作为一种翻译。
class Solution {
public:
int translateNum(int num) {
string s = to_string(num);
int n = s.size();
vector<int> f(n + 1);
f[0] = 1;
for (int i = 1; i <= n; i ++ ) {
f[i] = f[i - 1];
if (i > 1) {
int t = s[i - 1] - '0' + (s[i - 2] - '0') * 10;
if (t >= 10 && t <= 25) f[i] += f[i - 2];
}
}
return f[n];
}
};
class Solution {
public:
int res=0;
int translateNum(int num) {
string s=to_string(num);
Recursion(s,0);
return res;
}
void Recursion(string s,int i)
{
if(i==s.size())
{
res++;
return;
}
Recursion(s,i+1);
if(i+1<s.size()&&(s[i]=='1'||(s[i]=='2'&&s[i+1]<='5')))
Recursion(s,i+2);
return;
}
};