把数字翻译成字符串:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:首先用深度遍历的方法,对于每个位置,本身一定是可以作为一个字母来表示的,然后判断是否满足条件还可以和下一个数结合,条件即为组合起来的数要大于10(本数不为0)小于25
int translateNum(int num) {
//使用深度遍历
if(num < 0)
return 0;
//return translateCore(to_string(num),0);
return translateDp(to_string(num));
}
int translateCore(string num,int index){
//base case
if(index == num.size()){
//cout<<curStr<<endl;
return 1;
}
//对于每个位置,可以自己一个,可以和别人一起翻译
//普遍状态
int left = 0,right = 0;
left = translateCore(num,index+1);
if(index < num.size()-1 && num[index] != '0'){
string temp = "";
temp += num[index];
temp += num[index+1];
if(atoi(temp.c_str()) <= 25)
right = translateCore(num,index+2);
}
return left + right;
}
转换成dp,只有一个变量,所以用一个一维dp数组,根据base case可以确定dp[n-1] = 1,然后可以逆推回来,如果可以和下一个数合并,那么dp[i]就要加上dp[i+2],但是有特殊情况,其实应该也是一个base case,就是dp[n-2]如果可以合并的话就等于d[n-1]+1.
int translateDp(string num){
//转成dp
vector<int> dp(num.size(),0);
//base case
dp[num.size()-1] = 1;
for(int i=num.size()-2;i>=0;i--){
dp[i] = dp[i+1];
if(num[i] != '0' && ((num[i]-'0')*10+(num[i+1]-'0'))<=25)
if(i < num.size()-2)
dp[i]+=dp[i+2];
else
//特殊处理倒数第二个元素
dp[i]++;
}
return dp[0];
}