typedef long long ll;
const int N = 1e5+100;
const int mod = 1e9+7;
ll dp[N];
class Solution {
public:
int numDecodings(string s) {
memset(dp, 0, sizeof dp);
dp[0] = 1;
int len = s.length();
for (int i = 1; i <= len; ++i) {
if (s[i-1]=='*') dp[i] = (dp[i] +1ll*dp[i-1]*9%mod)%mod;
if (s[i-1] > '0') dp[i] = (dp[i] + dp[i-1])%mod;
if (i > 1) {
if (s[i-1] == '*') {
if(s[i-2] == '*') dp[i] = (dp[i] + 1ll*dp[i-2]*15%mod) %mod;
if (s[i-2] == '1') dp[i] = (dp[i] + 1ll*dp[i-2]*9) % mod;
if (s[i-2] == '2') dp[i] = (dp[i] + 1ll*dp[i-2]*6) % mod;
} else {
if (s[i-2] == '*') {
// printf("%d %d %d\n",dp[i],dp[i-2],i);
dp[i] = (dp[i] + dp[i-2]) % mod;
if (s[i-1] <= '6') dp[i] = (dp[i] + dp[i-2]) % mod;
} else {
int val = (s[i-2]-'0')*10 + (s[i-1] - '0');
if(val <= 26 && val >= 10) dp[i] = (dp[i] + dp[i-2]) % mod;
}
}
}
printf("%d\n",dp[i]);
}
return dp[len] % mod;
}
};
639. 解码方法 II
最新推荐文章于 2024-05-13 10:15:21 发布