商汤科技,数字解码成字符数目

有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。

现在给一串数字,给出有多少种可能的译码结果。

思路:动态规划,如果一串数字只有1个,那么只有一种,这是递推起点,如果有两个数字,那么这两个数字如果小于26,就有两种

从第三个数字开始,只需要考虑最后加入数字和前一个数字是否小于26,如果小于,就应该在d[i-1]的基础行加上d【i-2】。

代码:

  #include<iostream>
#include<string>
#include<vector>
using namespace std;
int numDecodings(string s) {
         int len=s.length();
         if (len==0||s[0]== '0' )
             return 0;
         vector< int > dp(len+1,0);    //dp[i]表示s[i-1]有多少种编码
         dp[0]=1;
         dp[1]=1;
         for ( int i=2;i<=len;i++){
             if (s[i-1]>= '1' &&s[i-1]<= '9' ){
                 dp[i]+=dp[i-1];
             }
             if (s[i-2]== '1' ||s[i-2]== '2' && s[i-1]>= '0' &&s[i-1]<= '6' )
                 dp[i] += dp[i-2];
         }
         return dp[len];
}
int main(){
     string str;
     cin>>str;
     int res=numDecodings(str);
     cout<<res;
     return 0;
}

猜你喜欢

转载自www.cnblogs.com/zzas0/p/10506452.html