Skip to content

Commit ececcea

Browse files
committed
Runtime: 36 ms (Top 69.86%) | Memory: 13.40 MB (Top 75.51%)
1 parent e0f3b99 commit ececcea

File tree

1 file changed

+58
-86
lines changed

1 file changed

+58
-86
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,69 @@
1+
// Runtime: 36 ms (Top 69.86%) | Memory: 13.40 MB (Top 75.51%)
2+
3+
#define ll long long
14
class Solution {
25
public:
3-
int numDecodings(string s) {
4-
int n=s.size();
5-
if(s[0]=='0')
6-
{
7-
return 0;
8-
}
9-
for(int i=0;i<n-1;++i)
10-
{
11-
if(s[i]==s[i+1]&&s[i]=='0')
12-
{
13-
return 0;
14-
}
15-
}
16-
long long dp[n][2],mod=1e9+7;
17-
//dp[i][0]-no of ways such that 0...i has been mapped with ith digit is mapped alone
18-
//dp[i][1]-no of ways such that 0...i has been mapped with ith digit is mapped with previous digit
19-
dp[0][0]=(s[0]=='*'?9:1);
20-
dp[0][1]=0;
21-
for(int i=1;i<n;++i)
22-
{
23-
if(s[i]!='0')
24-
{
25-
if(s[i]=='*')
26-
{
27-
long long m=9;
28-
dp[i][0]=((m%mod)*((dp[i-1][0]+dp[i-1][1])%mod))%mod;
29-
}
30-
else
31-
{
32-
dp[i][0]=(dp[i-1][0]+dp[i-1][1])%mod;
33-
}
34-
}
35-
else
36-
{
37-
dp[i][0]=0;
38-
}
39-
40-
if(s[i-1]=='0')
41-
{
42-
dp[i][1]=0;
43-
}
44-
else
45-
{
46-
if(s[i-1]=='*'||s[i]=='*')
47-
{
48-
long long m=1;
49-
if(s[i-1]=='*'&&s[i]=='*')
50-
{
51-
m=15;
52-
}
53-
else if(s[i-1]=='*')
54-
{
55-
int u=s[i]-'0';
56-
if(u>6)
57-
{
58-
m=1;
59-
}
60-
else
61-
{
62-
m=2;
63-
}
64-
}
6+
7+
ll numDecodings(string s) {
8+
9+
ll M = 1000000007;
10+
ll dp[s.size() + 1];
11+
memset(dp, 0, sizeof(dp));
12+
13+
dp[0] = 1;
14+
15+
for(int i = 1; i <= s.size(); i++){
16+
if(s[i - 1] == '*' and i == 1)
17+
dp[i] = 9;
18+
else if(s[i - 1] == '0' and i == 1)
19+
dp[i] = 0;
20+
else if(i == 1)
21+
dp[i] = 1;
22+
else{
23+
//now we need to check previous 2 characters for *,digit combination
24+
if(s[i - 1] == '*')
25+
dp[i] += (9 * dp[i - 1]) % M;
26+
else{
27+
if(s[i - 1] == '0')//since previous zero combination not possible according to question no partition can take place with a previous character 0
28+
dp[i] = 0;
6529
else
66-
{
67-
int v=s[i-1]-'0';
68-
if(v>2)m=0;
69-
else
70-
{
71-
if(v==1)m=9;
72-
else m=6;
73-
}
74-
}
75-
if(i-2>=0)dp[i][1]=((m%mod)*((dp[i-2][0]+dp[i-2][1])%mod))%mod;
76-
else dp[i][1]=m;
30+
dp[i] += dp[i - 1] % M;
31+
}
32+
33+
//for(int i = 0; i <= s.size(); i++)
34+
//cout << dp[i] << " ";
35+
//cout << "\n";
36+
37+
if(s[i - 2] == '*'){
38+
if(s[i - 1] == '*')
39+
dp[i] += (15 * dp[i - 2]) % M;
40+
else if(s[i - 1] > '6') // only 1 way
41+
dp[i] += dp[i - 2] % M;
42+
else
43+
dp[i] += (2 * dp[i - 2]) % M;
44+
7745
}
78-
else
79-
{
80-
int v=(s[i-1]-'0')*10+(s[i]-'0');
81-
if(v>=1&&v<=26)
82-
{
83-
if(i-2>=0)dp[i][1]=(dp[i-2][0]+dp[i-2][1])%mod;
84-
else dp[i][1]=1;
46+
else if(s[i - 2] == '1'){
47+
if(s[i - 1] == '*'){
48+
dp[i] += (9 * dp[i - 2]) % M;
8549
}
8650
else
87-
{
88-
dp[i][1]=0;
89-
}
51+
dp[i] += dp[i - 2] % M;
52+
53+
}
54+
else if(s[i - 2] == '2'){
55+
if(s[i - 1] == '*')
56+
dp[i] += (6 * dp[i - 2]) % M;
57+
else if(s[i - 1] <= '6')
58+
dp[i] += dp[i - 2] % M;
9059
}
91-
9260
}
93-
9461
}
95-
return (dp[n-1][0]+dp[n-1][1])%mod;
62+
63+
//for(int i = 0; i <= s.size(); i++)
64+
//cout << dp[i] << " ";
65+
//cout << "\n";
66+
67+
return dp[s.size()] % M;
9668
}
9769
};

0 commit comments

Comments
 (0)