|
| 1 | +// Runtime: 36 ms (Top 69.86%) | Memory: 13.40 MB (Top 75.51%) |
| 2 | + |
| 3 | +#define ll long long |
1 | 4 | class Solution {
|
2 | 5 | 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; |
65 | 29 | 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 | + |
77 | 45 | }
|
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; |
85 | 49 | }
|
86 | 50 | 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; |
90 | 59 | }
|
91 |
| - |
92 | 60 | }
|
93 |
| - |
94 | 61 | }
|
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; |
96 | 68 | }
|
97 | 69 | };
|
0 commit comments