题目
思路
动态规划f[i]=a*f[i-2]+b*f[i-1],边界值b为0
分一个字符和两个字符讨论,一个字符又分是0、*和其他字符讨论,两个字符分两个都是*,前面一个是*,后面一个是*,前面一个是0,其他正常字符讨论。
代码
class Solution {
public:
int check1(char ch){
if(ch=='0')
return 0;
else
return ch=='*'?9:1;
}
int check2(char ch0,char ch1){
if(ch0=='*'&&ch1=='*')
return 15;
if(ch0=='*')
return ch1<='6'?2:1;
if(ch1=='*'){
if(ch0=='1')
return 9;
else if(ch0=='2')
return 6;
return 0;
}
return ch0!='0'&&(ch0-'0')*10+(ch1-'0')<=26;
}
int numDecodings(string s) {
int len=s.length();
int mod=1000000007;
//a=f[i-2],b=f[i-1],c=f[i]
int a=0,b=1,c=0;
for(int i=1;i<=len;i++){
c=(long long)b*check1(s[i-1])%mod;
if(i>1)
c=(c+(long long)a*check2(s[i-2],s[i-1]))%mod;
a=b;
b=c;
}
return c;
}
};