题目说明:
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 :
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
解题思路:
动态规划最重要的就是找到主问题与子问题的关系表达式。而表达式往往出现在有限制性的语言当中。
如题所示:0翻译为a、1翻译为b……可以提炼出最为关键的一点信息,最后一位数字,仅可能与它前面一位的数字结合起来表示一个字母,且结合之后的数字<=25。
f(n):n个数字共有几个翻译方式
num[i]:第 i 位数字
代码示例:
注意:f(n)的n意味着第几位数字,从1开始;snum[n] 的n从0开始,所以要偏移一位
class Solution {
public:
int translateNum(int num) {
string snum = to_string(num);
if(snum.length()==0) return 1;
if(snum.length()==1) return 1;
vector<int> f;
int sum = 0;
f.resize(snum.size());
f[0] = 1;
f[1] = 1;
for(int i=2;i<=snum.length();i++){
f.push_back(0);
int temp = snum[i-1]-'0'+(snum[i-2]-'0')*10;
if(temp <= 25 && temp != snum[i-1]-'0'){
f[i]+=f[i-2];
}
f[i]+=f[i-1];
}
return f[snum.length()];
}
};