商汤科技,数字解码成字符数目
有一种将字母编码成数字的方式:'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;}

浙公网安备 33010602011771号