|
1 | 1 | #include <stdio.h>
|
2 | 2 | #include <stdlib.h>
|
3 | 3 | #include <string.h>
|
| 4 | +#include <assert.h> |
4 | 5 |
|
5 | 6 | int numDecodings(char *s) {
|
| 7 | + if (s == NULL) return 0; |
6 | 8 | int len = strlen(s);
|
7 | 9 | if (len == 0) return 0;
|
8 | | - int *d = (int *)calloc(len + 1, sizeof(int)); |
| 10 | + int *dp = (int *)malloc((len + 1) * sizeof(int)); |
9 | 11 | int i;
|
10 | | - d[0] = 1; |
11 | | - d[1] = (s[0] != '0') ? 1 : 0; |
| 12 | + dp[0] = 1; |
| 13 | + dp[1] = (s[0] == '0') ? 0 : 1; |
12 | 14 | for (i = 2; i < len + 1; i++) {
|
13 | | - if (s[i - 1] != '0') /*1 step*/ |
14 | | - d[i] += d[i - 1]; |
| 15 | + dp[i] = (s[i - 1] == '0') ? 0 : dp[i - 1]; /*1 step*/ |
15 | 16 | if (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] <= '6')) /*2 steps*/
|
16 | | - d[i] += d[i - 2]; |
| 17 | + dp[i] += dp[i - 2]; |
17 | 18 | }
|
18 | | - return d[len]; |
| 19 | + int ans = dp[len]; |
| 20 | + free(dp); |
| 21 | + return ans; |
19 | 22 | }
|
20 | 23 |
|
21 | 24 | int main() {
|
22 | | - char s[] = "301"; |
23 | | - printf("%d\n", numDecodings(s)); |
| 25 | + char s0[] = "301"; |
| 26 | + char s1[] = ""; |
| 27 | + char s2[] = "0"; |
| 28 | + char s3[] = "01"; |
| 29 | + char s4[] = "112"; |
| 30 | + assert(numDecodings(s0) == 0); |
| 31 | + assert(numDecodings(s1) == 0); |
| 32 | + assert(numDecodings(s2) == 0); |
| 33 | + assert(numDecodings(s3) == 0); |
| 34 | + assert(numDecodings(s4) == 3); |
| 35 | + |
| 36 | + printf("all tests passed!\n"); |
| 37 | + |
24 | 38 | return 0;
|
25 | 39 | }
|
0 commit comments