[剑指Offer]46-把数字翻译成字符串(递归思想,循环实现)

时间:2021-10-15 19:16:38

题意

'0'到'25'翻译成'a'到'z',故一个字符串可以有多种翻译方式,如12258有五种翻译方式。

给定字符串,输出有多少种翻译方式

解题思路

递归思想

  • 计f(i)为以第i个字符开始到原字符串结尾的串可翻译的方式数
  • 则f(i)=f(i+1)+g(i,i+1)*f(i+2);其中g函数为判定i,i+1位置对应的两个字符连在一起是否在0-25范围内的函数,是则返回1,否则返回0。

用循环实现,由小及大,故从后向前遍历。

时间负责度O(n).

代码

#include <iostream>
#include <string>
using namespace std; int inScope(char num1,char num2){
int number=(num1-'0')*10+(num2-'0');
if(number>=0&&number<=25){
return 1;
}
else{
return 0;
}
} int transMeansCnt(string str){
if(str.empty()){
return 0;
} int meansCnt[str.length()];
int endIdx=(int)str.length()-1;
for(int i=endIdx;i>=0;--i){
if(i==endIdx){
meansCnt[i]=1;
}
else if(i==endIdx-1){
meansCnt[i]=meansCnt[i+1]+inScope(str[i],str[i+1]);
}
else{
meansCnt[i]=meansCnt[i+1]+inScope(str[i],str[i+1])*meansCnt[i+2];
}
}
return meansCnt[0];
} int main(int argc, const char * argv[]) {
string s="12258";
int meansCnt=transMeansCnt(s);
cout<<meansCnt<<endl;
return 0;
}