title: 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
一开始拿到题目,并没有太多的思路,只是觉得这是一个组合问题,一般组合问题,都可以用树形结构来表达。题目中存在某些隐形的条件:
- 被翻译的数字至多2位且不能超过25
- 被翻译的数字,不能有前导0
因为条件1的存在,就决定了每次翻译,只有2种选择:只翻译一个或者2个,那么可以尝试着去画一下组合树
class Solution {
public:
bool is_valid(string str){
if(str[0]=='0') //前导0不行
return false;
int str2int = atoi(str.c_str());
return str2int<=25;
}
int translateNum(int num) {
int count = 0;
string str_num = to_string(num);
int full_str_len = str_num.length();
stack<string> s;
s.push(str_num);
string tmp_str,first_str,sencond_str,rest_firstr_str,rest_second_str;
while(!s.empty()){
string top_str = s.top();
if(top_str.length()==1){
count++;
s.pop();
continue;
}
if(top_str.length()==2 && is_valid(top_str))
count++;//2位数且小于26,那么可以接受,也是一种情况
s.pop();
first_str = top_str.substr(0,1);
rest_firstr_str = top_str.substr(1,full_str_len);
//小于等于2位数的时候,就不用再继续切分了,因为上面已经切分
if(top_str.length()>2){
sencond_str = top_str.substr(0,2);
rest_second_str = top_str.substr(2,full_str_len);
if(is_valid(sencond_str))
s.push(rest_second_str);
}
s.push(rest_firstr_str);
}
return count;
}
};