有一种将字母编码成数字的方式:'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;
}