Skip to content

Commit 2130b1a

Browse files
committed
feat: add solutions to lc/lcof problems
* lc No.0010 & lcof No.19.0010.Regular Expression Matching
1 parent 8b57250 commit 2130b1a

File tree

18 files changed

+994
-567
lines changed

18 files changed

+994
-567
lines changed

lcof/面试题19. 正则表达式匹配/README.md

+277-111
Large diffs are not rendered by default.

lcof/面试题19. 正则表达式匹配/Solution.cpp

+12-18
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,21 @@ class Solution {
22
public:
33
bool isMatch(string s, string p) {
44
int m = s.size(), n = p.size();
5-
if (n == 0) return m == 0;
6-
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
7-
dp[0][0] = true;
8-
for (int j = 1; j < n + 1; ++j) {
9-
if (p[j - 1] == '*') {
10-
dp[0][j] = dp[0][j - 2];
11-
}
12-
}
13-
for (int i = 1; i < m + 1; ++i) {
14-
for (int j = 1; j < n + 1; ++j) {
15-
if (s[i - 1] == p[j - 1] || p[j - 1] == '.') {
16-
dp[i][j] = dp[i - 1][j - 1];
17-
} else if (p[j - 1] == '*') {
18-
if (s[i - 1] == p[j - 2] || p[j - 2] == '.') {
19-
dp[i][j] = dp[i][j - 2] || dp[i - 1][j];
20-
} else {
21-
dp[i][j] = dp[i][j - 2];
5+
bool f[m + 1][n + 1];
6+
memset(f, false, sizeof f);
7+
f[0][0] = true;
8+
for (int i = 0; i <= m; ++i) {
9+
for (int j = 1; j <= n; ++j) {
10+
if (p[j - 1] == '*') {
11+
f[i][j] = f[i][j - 2];
12+
if (i && (p[j - 2] == '.' || p[j - 2] == s[i - 1])) {
13+
f[i][j] |= f[i - 1][j];
2214
}
15+
} else if (i && (p[j - 1] == '.' || p[j - 1] == s[i - 1])) {
16+
f[i][j] = f[i - 1][j - 1];
2317
}
2418
}
2519
}
26-
return dp[m][n];
20+
return f[m][n];
2721
}
2822
};
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,20 @@
11
public class Solution {
22
public bool IsMatch(string s, string p) {
33
int m = s.Length, n = p.Length;
4-
if (n == 0) {
5-
return m == 0;
6-
}
7-
bool[,] dp = new bool[m+1,n+1];
8-
dp[0,0] = true;
9-
for(int j = 1; j < n + 1; j++) {
10-
if (p[j-1] == '*') {
11-
dp[0,j] = dp[0,j-2];
12-
}
13-
}
14-
for (int i = 1; i < m + 1; i++) {
15-
for (int j = 1; j < n + 1; j++) {
16-
if (s[i-1] == p[j-1] || p[j-1] == '.') {
17-
dp[i,j] = dp[i-1,j-1];
18-
} else if (p[j-1] == '*') {
19-
if (p[j-2] == '.' || p[j-2] == s[i-1]) {
20-
dp[i,j] = dp[i,j-2] || dp[i-1,j];
21-
} else {
22-
dp[i,j] = dp[i,j-2];
4+
bool[,] f = new bool[m + 1, n + 1];
5+
f[0, 0] = true;
6+
for (int i = 0; i <= m; ++i) {
7+
for (int j = 1; j <= n; ++j) {
8+
if (p[j - 1] == '*') {
9+
f[i, j] = f[i, j - 2];
10+
if (i > 0 && (p[j - 2] == '.' || p[j - 2] == s[i - 1])) {
11+
f[i, j] |= f[i - 1, j];
2312
}
13+
} else if (i > 0 && (p[j - 1] == '.' || p[j - 1] == s[i - 1])) {
14+
f[i, j] = f[i - 1, j - 1];
2415
}
2516
}
2617
}
27-
return dp[m,n];
18+
return f[m, n];
2819
}
2920
}
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,21 @@
11
func isMatch(s string, p string) bool {
22
m, n := len(s), len(p)
3-
if n == 0 {
4-
return m == 0
3+
f := make([][]bool, m+1)
4+
for i := range f {
5+
f[i] = make([]bool, n+1)
56
}
6-
dp := make([][]bool, m+1)
7-
for i := 0; i < m+1; i++ {
8-
dp[i] = make([]bool, n+1)
9-
}
10-
dp[0][0] = true
11-
for j := 1; j < n+1; j++ {
12-
if p[j-1] == '*' {
13-
dp[0][j] = dp[0][j-2]
14-
}
15-
}
16-
for i := 1; i < m+1; i++ {
17-
for j := 1; j < n+1; j++ {
18-
if s[i-1] == p[j-1] || p[j-1] == '.' {
19-
dp[i][j] = dp[i-1][j-1]
20-
} else if p[j-1] == '*' {
21-
if s[i-1] == p[j-2] || p[j-2] == '.' {
22-
dp[i][j] = dp[i][j-2] || dp[i-1][j]
23-
} else {
24-
dp[i][j] = dp[i][j-2]
7+
f[0][0] = true
8+
for i := 0; i <= m; i++ {
9+
for j := 1; j <= n; j++ {
10+
if p[j-1] == '*' {
11+
f[i][j] = f[i][j-2]
12+
if i > 0 && (p[j-2] == '.' || p[j-2] == s[i-1]) {
13+
f[i][j] = f[i][j] || f[i-1][j]
2514
}
15+
} else if i > 0 && (p[j-1] == '.' || p[j-1] == s[i-1]) {
16+
f[i][j] = f[i-1][j-1]
2617
}
2718
}
2819
}
29-
return dp[m][n]
20+
return f[m][n]
3021
}
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,20 @@
11
class Solution {
22
public boolean isMatch(String s, String p) {
33
int m = s.length(), n = p.length();
4-
if (n == 0) {
5-
return m == 0;
6-
}
7-
boolean[][] dp = new boolean[m + 1][n + 1];
8-
dp[0][0] = true;
9-
for (int j = 1; j < n + 1; ++j) {
10-
if (p.charAt(j - 1) == '*') {
11-
dp[0][j] = dp[0][j - 2];
12-
}
13-
}
14-
for (int i = 1; i < m + 1; ++i) {
15-
for (int j = 1; j < n + 1; ++j) {
16-
if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '.') {
17-
dp[i][j] = dp[i - 1][j - 1];
18-
} else if (p.charAt(j - 1) == '*') {
19-
if (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.') {
20-
dp[i][j] = dp[i][j - 2] || dp[i - 1][j];
21-
} else {
22-
dp[i][j] = dp[i][j - 2];
4+
boolean[][] f = new boolean[m + 1][n + 1];
5+
f[0][0] = true;
6+
for (int i = 0; i <= m; ++i) {
7+
for (int j = 1; j <= n; ++j) {
8+
if (p.charAt(j - 1) == '*') {
9+
f[i][j] = f[i][j - 2];
10+
if (i > 0 && (p.charAt(j - 2) == '.' || p.charAt(j - 2) == s.charAt(i - 1))) {
11+
f[i][j] |= f[i - 1][j];
2312
}
13+
} else if (i > 0 && (p.charAt(j - 1) == '.' || p.charAt(j - 1) == s.charAt(i - 1))) {
14+
f[i][j] = f[i - 1][j - 1];
2415
}
2516
}
2617
}
27-
return dp[m][n];
18+
return f[m][n];
2819
}
2920
}

lcof/面试题19. 正则表达式匹配/Solution.js

+15-14
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,21 @@
44
* @return {boolean}
55
*/
66
var isMatch = function (s, p) {
7-
// 回溯大法好
8-
let memo = {};
9-
function recursive(i, j) {
10-
if (memo[[i, j]] !== undefined) return memo[[i, j]];
11-
if (j === p.length) return i === s.length;
12-
let tmp = i < s.length && (s[i] === p[j] || p[j] === '.');
13-
let ans = false;
14-
if (p[j + 1] === '*') {
15-
ans = recursive(i, j + 2) || (tmp && recursive(i + 1, j));
16-
} else {
17-
ans = tmp && recursive(i + 1, j + 1);
7+
const m = s.length;
8+
const n = p.length;
9+
const f = Array.from({ length: m + 1 }, () => Array(n + 1).fill(false));
10+
f[0][0] = true;
11+
for (let i = 0; i <= m; ++i) {
12+
for (let j = 1; j <= n; ++j) {
13+
if (p[j - 1] === '*') {
14+
f[i][j] = f[i][j - 2];
15+
if (i && (p[j - 2] === '.' || p[j - 2] == s[i - 1])) {
16+
f[i][j] |= f[i - 1][j];
17+
}
18+
} else if (i && (p[j - 1] === '.' || p[j - 1] == s[i - 1])) {
19+
f[i][j] = f[i - 1][j - 1];
20+
}
1821
}
19-
memo[[i, j]] = ans;
20-
return ans;
2122
}
22-
return recursive(0, 0);
23+
return f[m][n];
2324
};
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
class Solution:
22
def isMatch(self, s: str, p: str) -> bool:
33
m, n = len(s), len(p)
4-
if n == 0:
5-
return m == 0
6-
dp = [[False] * (n + 1) for _ in range(m + 1)]
7-
dp[0][0] = True
8-
for j in range(2, n + 1):
9-
if p[j - 1] == '*':
10-
dp[0][j] = dp[0][j - 2]
11-
for i in range(1, m + 1):
4+
f = [[False] * (n + 1) for _ in range(m + 1)]
5+
f[0][0] = True
6+
for i in range(m + 1):
127
for j in range(1, n + 1):
13-
if s[i - 1] == p[j - 1] or p[j - 1] == '.':
14-
dp[i][j] = dp[i - 1][j - 1]
15-
elif p[j - 1] == '*':
16-
if p[j - 2] == '.' or p[j - 2] == s[i - 1]:
17-
dp[i][j] = dp[i][j - 2] or dp[i - 1][j]
18-
else:
19-
dp[i][j] = dp[i][j - 2]
20-
return dp[-1][-1]
8+
if p[j - 1] == "*":
9+
f[i][j] = f[i][j - 2]
10+
if i > 0 and (p[j - 2] == "." or s[i - 1] == p[j - 2]):
11+
f[i][j] |= f[i - 1][j]
12+
elif i > 0 and (p[j - 1] == "." or s[i - 1] == p[j - 1]):
13+
f[i][j] = f[i - 1][j - 1]
14+
return f[m][n]

0 commit comments

Comments
 (0)