Skip to content

Commit 3b9a66c

Browse files
committed
2 parents 04e664c + 481cb58 commit 3b9a66c

File tree

11 files changed

+348
-99
lines changed

11 files changed

+348
-99
lines changed

solution/0000-0099/0010.Regular Expression Matching/README.md

Lines changed: 58 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,44 @@ public class Solution {
331331
}
332332
```
333333

334+
#### C
335+
336+
```c
337+
#define MAX_LEN 1000
338+
339+
char *ss, *pp;
340+
int m, n;
341+
int f[MAX_LEN + 1][MAX_LEN + 1];
342+
343+
bool dfs(int i, int j) {
344+
if (j >= n) {
345+
return i == m;
346+
}
347+
if (f[i][j] != 0) {
348+
return f[i][j] == 1;
349+
}
350+
int res = -1;
351+
if (j + 1 < n && pp[j + 1] == '*') {
352+
if (dfs(i, j + 2) || (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j))) {
353+
res = 1;
354+
}
355+
} else if (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j + 1)) {
356+
res = 1;
357+
}
358+
f[i][j] = res;
359+
return res == 1;
360+
}
361+
362+
bool isMatch(char* s, char* p) {
363+
ss = s;
364+
pp = p;
365+
m = strlen(s);
366+
n = strlen(p);
367+
memset(f, 0, sizeof(f));
368+
return dfs(0, 0);
369+
}
370+
```
371+
334372
<!-- tabs:end -->
335373
336374
<!-- solution:end -->
@@ -581,31 +619,26 @@ class Solution {
581619

582620
#### C
583621

584-
``` C
585-
bool isMatch(char *s, char *p) {
586-
int m = strlen(s), n = strlen(p);
587-
bool **dp = malloc((m + 1) * sizeof(bool *));
588-
for (int i = 0; i <= m; i++)
589-
dp[i] = calloc(n + 1, sizeof(bool));
590-
dp[0][0] = 1;
591-
for (int j = 2; j <= n; j++)
592-
if (p[j - 1] == '*')
593-
dp[0][j] = dp[0][j - 2];
594-
595-
for (int i = 1; i <= m; i++)
596-
for (int j = 1; j <= n; j++)
597-
if (p[j - 1] == '*')
598-
dp[i][j] = dp[i][j - 2] ||
599-
((p[j - 2] == '.' || p[j - 2] == s[i - 1]) && dp[i - 1][j]);
600-
else
601-
dp[i][j] =
602-
(p[j - 1] == '.' || p[j - 1] == s[i - 1]) && dp[i - 1][j - 1];
603-
604-
bool res = dp[m][n];
605-
for (int i = 0; i <= m; i++)
606-
free(dp[i]);
607-
free(dp);
608-
return res;
622+
```c
623+
bool isMatch(char* s, char* p) {
624+
int m = strlen(s), n = strlen(p);
625+
bool f[m + 1][n + 1];
626+
memset(f, 0, sizeof(f));
627+
f[0][0] = true;
628+
629+
for (int i = 0; i <= m; ++i) {
630+
for (int j = 1; j <= n; ++j) {
631+
if (p[j - 1] == '*') {
632+
f[i][j] = f[i][j - 2];
633+
if (i > 0 && (p[j - 2] == '.' || p[j - 2] == s[i - 1])) {
634+
f[i][j] = f[i][j] || f[i - 1][j];
635+
}
636+
} else if (i > 0 && (p[j - 1] == '.' || p[j - 1] == s[i - 1])) {
637+
f[i][j] = f[i - 1][j - 1];
638+
}
639+
}
640+
}
641+
return f[m][n];
609642
}
610643
```
611644

solution/0000-0099/0010.Regular Expression Matching/README_EN.md

Lines changed: 59 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,44 @@ public class Solution {
330330
}
331331
```
332332

333+
#### C
334+
335+
```c
336+
#define MAX_LEN 1000
337+
338+
char *ss, *pp;
339+
int m, n;
340+
int f[MAX_LEN + 1][MAX_LEN + 1];
341+
342+
bool dfs(int i, int j) {
343+
if (j >= n) {
344+
return i == m;
345+
}
346+
if (f[i][j] != 0) {
347+
return f[i][j] == 1;
348+
}
349+
int res = -1;
350+
if (j + 1 < n && pp[j + 1] == '*') {
351+
if (dfs(i, j + 2) || (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j))) {
352+
res = 1;
353+
}
354+
} else if (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j + 1)) {
355+
res = 1;
356+
}
357+
f[i][j] = res;
358+
return res == 1;
359+
}
360+
361+
bool isMatch(char* s, char* p) {
362+
ss = s;
363+
pp = p;
364+
m = strlen(s);
365+
n = strlen(p);
366+
memset(f, 0, sizeof(f));
367+
return dfs(0, 0);
368+
}
369+
```
370+
333371
<!-- tabs:end -->
334372
335373
<!-- solution:end -->
@@ -580,33 +618,29 @@ class Solution {
580618

581619
#### C
582620

583-
``` C
584-
bool isMatch(char *s, char *p) {
585-
int m = strlen(s), n = strlen(p);
586-
bool **dp = malloc((m + 1) * sizeof(bool *));
587-
for (int i = 0; i <= m; i++)
588-
dp[i] = calloc(n + 1, sizeof(bool));
589-
dp[0][0] = 1;
590-
for (int j = 2; j <= n; j++)
591-
if (p[j - 1] == '*')
592-
dp[0][j] = dp[0][j - 2];
593-
594-
for (int i = 1; i <= m; i++)
595-
for (int j = 1; j <= n; j++)
596-
if (p[j - 1] == '*')
597-
dp[i][j] = dp[i][j - 2] ||
598-
((p[j - 2] == '.' || p[j - 2] == s[i - 1]) && dp[i - 1][j]);
599-
else
600-
dp[i][j] =
601-
(p[j - 1] == '.' || p[j - 1] == s[i - 1]) && dp[i - 1][j - 1];
602-
603-
bool res = dp[m][n];
604-
for (int i = 0; i <= m; i++)
605-
free(dp[i]);
606-
free(dp);
607-
return res;
621+
```c
622+
bool isMatch(char* s, char* p) {
623+
int m = strlen(s), n = strlen(p);
624+
bool f[m + 1][n + 1];
625+
memset(f, 0, sizeof(f));
626+
f[0][0] = true;
627+
628+
for (int i = 0; i <= m; ++i) {
629+
for (int j = 1; j <= n; ++j) {
630+
if (p[j - 1] == '*') {
631+
f[i][j] = f[i][j - 2];
632+
if (i > 0 && (p[j - 2] == '.' || p[j - 2] == s[i - 1])) {
633+
f[i][j] = f[i][j] || f[i - 1][j];
634+
}
635+
} else if (i > 0 && (p[j - 1] == '.' || p[j - 1] == s[i - 1])) {
636+
f[i][j] = f[i - 1][j - 1];
637+
}
638+
}
639+
}
640+
return f[m][n];
608641
}
609642
```
643+
610644
<!-- tabs:end -->
611645
612646
<!-- solution:end -->
Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,33 @@
1-
bool isMatch(char* s, char* p) {
2-
int m = strlen(s), n = strlen(p);
3-
bool** dp = malloc((m + 1) * sizeof(bool*));
4-
for (int i = 0; i <= m; i++)
5-
dp[i] = calloc(n + 1, sizeof(bool));
6-
dp[0][0] = 1;
7-
for (int j = 2; j <= n; j++)
8-
if (p[j - 1] == '*')
9-
dp[0][j] = dp[0][j - 2];
1+
#define MAX_LEN 1000
2+
3+
char *ss, *pp;
4+
int m, n;
5+
int f[MAX_LEN + 1][MAX_LEN + 1];
106

11-
for (int i = 1; i <= m; i++)
12-
for (int j = 1; j <= n; j++)
13-
if (p[j - 1] == '*')
14-
dp[i][j] = dp[i][j - 2] || ((p[j - 2] == '.' || p[j - 2] == s[i - 1]) && dp[i - 1][j]);
15-
else
16-
dp[i][j] = (p[j - 1] == '.' || p[j - 1] == s[i - 1]) && dp[i - 1][j - 1];
7+
bool dfs(int i, int j) {
8+
if (j >= n) {
9+
return i == m;
10+
}
11+
if (f[i][j] != 0) {
12+
return f[i][j] == 1;
13+
}
14+
int res = -1;
15+
if (j + 1 < n && pp[j + 1] == '*') {
16+
if (dfs(i, j + 2) || (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j))) {
17+
res = 1;
18+
}
19+
} else if (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j + 1)) {
20+
res = 1;
21+
}
22+
f[i][j] = res;
23+
return res == 1;
24+
}
1725

18-
bool res = dp[m][n];
19-
for (int i = 0; i <= m; i++)
20-
free(dp[i]);
21-
free(dp);
22-
return res;
23-
}
26+
bool isMatch(char* s, char* p) {
27+
ss = s;
28+
pp = p;
29+
m = strlen(s);
30+
n = strlen(p);
31+
memset(f, 0, sizeof(f));
32+
return dfs(0, 0);
33+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
bool isMatch(char* s, char* p) {
2+
int m = strlen(s), n = strlen(p);
3+
bool f[m + 1][n + 1];
4+
memset(f, 0, sizeof(f));
5+
f[0][0] = true;
6+
7+
for (int i = 0; i <= m; ++i) {
8+
for (int j = 1; j <= n; ++j) {
9+
if (p[j - 1] == '*') {
10+
f[i][j] = f[i][j - 2];
11+
if (i > 0 && (p[j - 2] == '.' || p[j - 2] == s[i - 1])) {
12+
f[i][j] = f[i][j] || f[i - 1][j];
13+
}
14+
} else if (i > 0 && (p[j - 1] == '.' || p[j - 1] == s[i - 1])) {
15+
f[i][j] = f[i - 1][j - 1];
16+
}
17+
}
18+
}
19+
return f[m][n];
20+
}

solution/0000-0099/0011.Container With Most Water/README.md

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -264,19 +264,30 @@ class Solution {
264264

265265
#### C
266266

267-
``` C
268-
269-
int maxArea(int *h, int n) {
270-
int l = 0, r = n - 1, max = 0;
271-
while (l < r) {
272-
int area = (r - l) * (h[l] < h[r] ? h[l++] : h[r--]);
273-
if (area > max)
274-
max = area;
275-
}
276-
return max;
267+
```c
268+
int min(int a, int b) {
269+
return a < b ? a : b;
277270
}
278271

279-
```
272+
int max(int a, int b) {
273+
return a > b ? a : b;
274+
}
275+
276+
int maxArea(int* height, int heightSize) {
277+
int l = 0, r = heightSize - 1;
278+
int ans = 0;
279+
while (l < r) {
280+
int t = min(height[l], height[r]) * (r - l);
281+
ans = max(ans, t);
282+
if (height[l] < height[r]) {
283+
++l;
284+
} else {
285+
--r;
286+
}
287+
}
288+
return ans;
289+
}
290+
```
280291
281292
<!-- tabs:end -->
282293

solution/0000-0099/0011.Container With Most Water/README_EN.md

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -261,19 +261,31 @@ class Solution {
261261

262262
#### C
263263

264-
``` C
265-
266-
int maxArea(int *h, int n) {
267-
int l = 0, r = n - 1, max = 0;
268-
while (l < r) {
269-
int area = (r - l) * (h[l] < h[r] ? h[l++] : h[r--]);
270-
if (area > max)
271-
max = area;
272-
}
273-
return max;
264+
```c
265+
int min(int a, int b) {
266+
return a < b ? a : b;
274267
}
275268

276-
```
269+
int max(int a, int b) {
270+
return a > b ? a : b;
271+
}
272+
273+
int maxArea(int* height, int heightSize) {
274+
int l = 0, r = heightSize - 1;
275+
int ans = 0;
276+
while (l < r) {
277+
int t = min(height[l], height[r]) * (r - l);
278+
ans = max(ans, t);
279+
if (height[l] < height[r]) {
280+
++l;
281+
} else {
282+
--r;
283+
}
284+
}
285+
return ans;
286+
}
287+
```
288+
277289
<!-- tabs:end -->
278290
279291
<!-- solution:end -->
Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
1-
int maxArea(int* h, int n) {
2-
int l = 0, r = n - 1, max = 0;
1+
int min(int a, int b) {
2+
return a < b ? a : b;
3+
}
4+
5+
int max(int a, int b) {
6+
return a > b ? a : b;
7+
}
8+
9+
int maxArea(int* height, int heightSize) {
10+
int l = 0, r = heightSize - 1;
11+
int ans = 0;
312
while (l < r) {
4-
int area = (r - l) * (h[l] < h[r] ? h[l++] : h[r--]);
5-
if (area > max)
6-
max = area;
13+
int t = min(height[l], height[r]) * (r - l);
14+
ans = max(ans, t);
15+
if (height[l] < height[r]) {
16+
++l;
17+
} else {
18+
--r;
19+
}
720
}
8-
return max;
21+
return ans;
922
}

0 commit comments

Comments
 (0)