diff --git a/solution/0000-0099/0010.Regular Expression Matching/README.md b/solution/0000-0099/0010.Regular Expression Matching/README.md index 5eb9ff8be6f3d..683a3eb2795f9 100644 --- a/solution/0000-0099/0010.Regular Expression Matching/README.md +++ b/solution/0000-0099/0010.Regular Expression Matching/README.md @@ -331,6 +331,44 @@ public class Solution { } ``` +#### C + +```c +#define MAX_LEN 1000 + +char *ss, *pp; +int m, n; +int f[MAX_LEN + 1][MAX_LEN + 1]; + +bool dfs(int i, int j) { + if (j >= n) { + return i == m; + } + if (f[i][j] != 0) { + return f[i][j] == 1; + } + int res = -1; + if (j + 1 < n && pp[j + 1] == '*') { + if (dfs(i, j + 2) || (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j))) { + res = 1; + } + } else if (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j + 1)) { + res = 1; + } + f[i][j] = res; + return res == 1; +} + +bool isMatch(char* s, char* p) { + ss = s; + pp = p; + m = strlen(s); + n = strlen(p); + memset(f, 0, sizeof(f)); + return dfs(0, 0); +} +``` + @@ -579,6 +617,31 @@ class Solution { } ``` +#### C + +```c +bool isMatch(char* s, char* p) { + int m = strlen(s), n = strlen(p); + bool f[m + 1][n + 1]; + memset(f, 0, sizeof(f)); + f[0][0] = true; + + for (int i = 0; i <= m; ++i) { + for (int j = 1; j <= n; ++j) { + if (p[j - 1] == '*') { + f[i][j] = f[i][j - 2]; + if (i > 0 && (p[j - 2] == '.' || p[j - 2] == s[i - 1])) { + f[i][j] = f[i][j] || f[i - 1][j]; + } + } else if (i > 0 && (p[j - 1] == '.' || p[j - 1] == s[i - 1])) { + f[i][j] = f[i - 1][j - 1]; + } + } + } + return f[m][n]; +} +``` + diff --git a/solution/0000-0099/0010.Regular Expression Matching/README_EN.md b/solution/0000-0099/0010.Regular Expression Matching/README_EN.md index d7302fddd9809..5f7d07ae1b9a8 100644 --- a/solution/0000-0099/0010.Regular Expression Matching/README_EN.md +++ b/solution/0000-0099/0010.Regular Expression Matching/README_EN.md @@ -330,6 +330,44 @@ public class Solution { } ``` +#### C + +```c +#define MAX_LEN 1000 + +char *ss, *pp; +int m, n; +int f[MAX_LEN + 1][MAX_LEN + 1]; + +bool dfs(int i, int j) { + if (j >= n) { + return i == m; + } + if (f[i][j] != 0) { + return f[i][j] == 1; + } + int res = -1; + if (j + 1 < n && pp[j + 1] == '*') { + if (dfs(i, j + 2) || (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j))) { + res = 1; + } + } else if (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j + 1)) { + res = 1; + } + f[i][j] = res; + return res == 1; +} + +bool isMatch(char* s, char* p) { + ss = s; + pp = p; + m = strlen(s); + n = strlen(p); + memset(f, 0, sizeof(f)); + return dfs(0, 0); +} +``` + @@ -578,6 +616,31 @@ class Solution { } ``` +#### C + +```c +bool isMatch(char* s, char* p) { + int m = strlen(s), n = strlen(p); + bool f[m + 1][n + 1]; + memset(f, 0, sizeof(f)); + f[0][0] = true; + + for (int i = 0; i <= m; ++i) { + for (int j = 1; j <= n; ++j) { + if (p[j - 1] == '*') { + f[i][j] = f[i][j - 2]; + if (i > 0 && (p[j - 2] == '.' || p[j - 2] == s[i - 1])) { + f[i][j] = f[i][j] || f[i - 1][j]; + } + } else if (i > 0 && (p[j - 1] == '.' || p[j - 1] == s[i - 1])) { + f[i][j] = f[i - 1][j - 1]; + } + } + } + return f[m][n]; +} +``` + diff --git a/solution/0000-0099/0010.Regular Expression Matching/Solution.c b/solution/0000-0099/0010.Regular Expression Matching/Solution.c new file mode 100644 index 0000000000000..db0116921230e --- /dev/null +++ b/solution/0000-0099/0010.Regular Expression Matching/Solution.c @@ -0,0 +1,33 @@ +#define MAX_LEN 1000 + +char *ss, *pp; +int m, n; +int f[MAX_LEN + 1][MAX_LEN + 1]; + +bool dfs(int i, int j) { + if (j >= n) { + return i == m; + } + if (f[i][j] != 0) { + return f[i][j] == 1; + } + int res = -1; + if (j + 1 < n && pp[j + 1] == '*') { + if (dfs(i, j + 2) || (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j))) { + res = 1; + } + } else if (i < m && (ss[i] == pp[j] || pp[j] == '.') && dfs(i + 1, j + 1)) { + res = 1; + } + f[i][j] = res; + return res == 1; +} + +bool isMatch(char* s, char* p) { + ss = s; + pp = p; + m = strlen(s); + n = strlen(p); + memset(f, 0, sizeof(f)); + return dfs(0, 0); +} diff --git a/solution/0000-0099/0010.Regular Expression Matching/Solution2.c b/solution/0000-0099/0010.Regular Expression Matching/Solution2.c new file mode 100644 index 0000000000000..9240063d8bd6a --- /dev/null +++ b/solution/0000-0099/0010.Regular Expression Matching/Solution2.c @@ -0,0 +1,20 @@ +bool isMatch(char* s, char* p) { + int m = strlen(s), n = strlen(p); + bool f[m + 1][n + 1]; + memset(f, 0, sizeof(f)); + f[0][0] = true; + + for (int i = 0; i <= m; ++i) { + for (int j = 1; j <= n; ++j) { + if (p[j - 1] == '*') { + f[i][j] = f[i][j - 2]; + if (i > 0 && (p[j - 2] == '.' || p[j - 2] == s[i - 1])) { + f[i][j] = f[i][j] || f[i - 1][j]; + } + } else if (i > 0 && (p[j - 1] == '.' || p[j - 1] == s[i - 1])) { + f[i][j] = f[i - 1][j - 1]; + } + } + } + return f[m][n]; +} diff --git a/solution/0000-0099/0011.Container With Most Water/README.md b/solution/0000-0099/0011.Container With Most Water/README.md index 1a3de695501d6..70c5128220e2c 100644 --- a/solution/0000-0099/0011.Container With Most Water/README.md +++ b/solution/0000-0099/0011.Container With Most Water/README.md @@ -262,6 +262,33 @@ class Solution { } ``` +#### C + +```c +int min(int a, int b) { + return a < b ? a : b; +} + +int max(int a, int b) { + return a > b ? a : b; +} + +int maxArea(int* height, int heightSize) { + int l = 0, r = heightSize - 1; + int ans = 0; + while (l < r) { + int t = min(height[l], height[r]) * (r - l); + ans = max(ans, t); + if (height[l] < height[r]) { + ++l; + } else { + --r; + } + } + return ans; +} +``` + diff --git a/solution/0000-0099/0011.Container With Most Water/README_EN.md b/solution/0000-0099/0011.Container With Most Water/README_EN.md index 5d113a38fbc66..0a0ab8c8f7108 100644 --- a/solution/0000-0099/0011.Container With Most Water/README_EN.md +++ b/solution/0000-0099/0011.Container With Most Water/README_EN.md @@ -259,6 +259,33 @@ class Solution { } ``` +#### C + +```c +int min(int a, int b) { + return a < b ? a : b; +} + +int max(int a, int b) { + return a > b ? a : b; +} + +int maxArea(int* height, int heightSize) { + int l = 0, r = heightSize - 1; + int ans = 0; + while (l < r) { + int t = min(height[l], height[r]) * (r - l); + ans = max(ans, t); + if (height[l] < height[r]) { + ++l; + } else { + --r; + } + } + return ans; +} +``` + diff --git a/solution/0000-0099/0011.Container With Most Water/Solution.c b/solution/0000-0099/0011.Container With Most Water/Solution.c new file mode 100644 index 0000000000000..a2dd45e5b194d --- /dev/null +++ b/solution/0000-0099/0011.Container With Most Water/Solution.c @@ -0,0 +1,22 @@ +int min(int a, int b) { + return a < b ? a : b; +} + +int max(int a, int b) { + return a > b ? a : b; +} + +int maxArea(int* height, int heightSize) { + int l = 0, r = heightSize - 1; + int ans = 0; + while (l < r) { + int t = min(height[l], height[r]) * (r - l); + ans = max(ans, t); + if (height[l] < height[r]) { + ++l; + } else { + --r; + } + } + return ans; +}