题目链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/
题意:
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
方法: 动态规划
class Solution {
public:
int translateNum(int num) {
string s = to_string(num);//将数组转换为字符串形式
int a = 1,b = 1,size = s.size();//动态规划,a表示前前个位置有多少种不同的翻译,b表示前一个位置有多少种不同的翻译,size表示s的长度
for(int i=2;i<=size;i++)
{
string tmp = s.substr(i-2,2);//截取两个字符作为字符串
int c = tmp.compare("10")>=0&&tmp.compare("25")<=0?a+b:b;//比较一下这个字符串是不是在10和25之间,如果是的话,就叠加前一种翻译的数目和前前翻译的数目,否则就只能叠加前一个翻译的数目
a = b;//状态量前移
b = c;//状态量前移
}
return b;//返回最后结果
}
};
优化,取消原来转化为字符串的步骤
class Solution {
public:
int translateNum(int num) {
int a = 1,b = 1,pre=num%10,cur=0;//pre表示前一个值,当前值
while(num)
{
num/=10;//相当于去掉最后一个数
cur = num%10;//当前数相当于再对10取余
int tmp = cur*10+pre;//暂存这个两位数
int c = tmp>=10&&tmp<=25?a+b:b;//如果可以凑成一个两位数,相当于前一个字符的方案数加上前前个字符的方案数,否则就只能加上前一个字符的方案数
a = b;
b = c;
pre = cur;//数字移动
}
return b;
}
};