题目
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:
0 <= num < 231
思路
dfs
在固定了前pos位的前提下,对后续进行翻译,可以截取1位或者2位。
- 时间复杂度:O(N),需要遍历每一个字符
- 空间复杂度:O(N),每次都截取1位的情况时递归深度为O(N)
但是不加记忆化肯定是要比动态规划慢的,只是这道题的数字最大就是INT_MAX,如果使用更长的数据的话dfs会呈指数上涨的。
class Solution {
public:
int translateNum(int num) {
string str = to_string(num);
if( str.length() == 1 ){
return 1;
}
anws = 0;
dfs(str, 0);
return anws;
}
private:
int anws;
//str[0...pos-1]已经划分好,现在需要对str[pos...n-1]划分
void dfs( string str, int pos){
if( pos == str.length() ){
anws++;
return;
}
//首先我们截取一位
dfs(str, pos+1);
//另外如果str[pos..pos+1]小于25,也可以截取两位
if( satisfy(str, pos) ){
dfs(str, pos+2);
}
}
bool satisfy(string str, int pos){
if( pos == str.length()-1 )
return false;
if(str[pos]=='0')
return false;
if( str.substr(pos, 2) > "25" )//从pos开始的2个字符
return false;
return true;
}
};