4
ll numDecodings(string s) {7
memset(dp, 0, sizeof(dp));11
for (int i = 1; i <= s.size(); i++) {12
if (s[i - 1] == '*' and i == 1)14
else if (s[i - 1] == '0' and i == 1)19
// now we need to check previous 2 characters for *,digit combination21
dp[i] += (9 * dp[i - 1]) % M;23
if (s[i - 1] == '0') // since previous zero combination not possible24
// according to question no partition can take25
// place with a previous character 028
dp[i] += dp[i - 1] % M;31
// for(int i = 0; i <= s.size(); i++)32
// cout << dp[i] << " ";35
if (s[i - 2] == '*') {37
dp[i] += (15 * dp[i - 2]) % M;38
else if (s[i - 1] > '6') // only 1 way39
dp[i] += dp[i - 2] % M;41
dp[i] += (2 * dp[i - 2]) % M;43
} else if (s[i - 2] == '1') {44
if (s[i - 1] == '*') {45
dp[i] += (9 * dp[i - 2]) % M;47
dp[i] += dp[i - 2] % M;49
} else if (s[i - 2] == '2') {51
dp[i] += (6 * dp[i - 2]) % M;52
else if (s[i - 1] <= '6')53
dp[i] += dp[i - 2] % M;58
// for(int i = 0; i <= s.size(); i++)59
// cout << dp[i] << " ";62
return dp[s.size()] % M;