题目链接
题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:
0 <= num < 231
思路
直接dfs枚举所有情况,从数字尾部开始处理,每次取出当前数字的个位、十位,并判断能否组成0-25的数字,然后截断数字,不断往下搜索,直到数字变为0,ans加1。
代码如下:
class Solution {
public:
int translateNum(int num) {
int ans=0;
dfs(ans,num);
return ans;
}
void dfs(int &ans,int nownum){
if(nownum==0){
ans++;
return;
}
//取出个位
int nowpos=nownum%10,nextpos=0;
//取出十位
if(nownum/10)
nextpos=(nownum/10)%10;
//组成新数字
int num=nextpos*10+nowpos;
//如果组成新数字在0-25范围
if(nextpos&&num>=0&&num<=25){
dfs(ans,nownum/10);
dfs(ans,nownum/100);
}
//如果仅能提取个位作为数字,不能使用十位
else
dfs(ans,nownum/10);
}
};