问题描述:
给定一个数字,我们按照如下规则把它翻译为字符串:
0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。
一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。
请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。
样例
- 输入:“12258”
- 输出:5
使用动态规划求解,首先明确三步 1)状态表示 2)状态计算 3)边界条件。在本题目中,使用 f(i) 来表示前 i 个字母可以构成的翻译方式个数。f(i)=f(i-1)+f(i-2) 这种情况是使用到两个字母的情况, 字母顺序从10到25的构成需要两个字母,因此需要判断使用两个字母的范围是在10~25之间才成立。 如果只使用一个字母那么f(i)=f(i-1)
class Solution {
public:
int getTranslationCount(string s) {
int n=s.size();
vector<int> f(n+1);
f[0]=1;
for(int i=1;i<=n;i++)
{
f[i]=f[i-1];
int t=10*(s[i-2]-'0')+(s[i-1]-'0');
if(t>=10&&t<=25) f[i]+=f[i-2];
}
return f[n];
}
};
2021.5.16
题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”
与把数字翻译成字符串类似,两个题目转化条件不一致。本题目0可以组成数字,链接中的题目0无法组成数字,因此需要变换一下动态规划的式子。
对于本题目不需要考虑某一位置为0的情况直接转化就行。对于大于两位的数字需要考虑前面一位数字和当前位组成的数字其范围是否在10~25之间,如果在dp[i]+=dp[i-2];
class Solution {
public:
int translateNum(int num) {
string nums = to_string(num);
int n = nums.size();
vector<int> dp(n+1,0);
dp[0]=1;
for(int i=1;i<=n;i++)
{
dp[i] = dp[i-1];
if(i>=2)
{
int t = (nums[i-2]-'0')*10+ nums[i-1]-'0';
if(t>=10 && t<=25) dp[i]+=dp[i-2];
}
}
return dp[n];
}
};