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

题意

'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;
}

猜你喜欢

转载自www.cnblogs.com/coding-gaga/p/10556933.html