Skip to content

Commit 8393cd6

Browse files
committed
feat: add solutions to lc problem: No.0044
No.0044.Wildcard Matching
1 parent 3f60675 commit 8393cd6

File tree

6 files changed

+279
-19
lines changed

6 files changed

+279
-19
lines changed

solution/0000-0099/0044.Wildcard Matching/README.md

+109-1
Original file line numberDiff line numberDiff line change
@@ -67,22 +67,130 @@ p = "a*c?b"
6767

6868
<!-- 这里可写通用的实现逻辑 -->
6969

70+
**方法一:动态规划**
71+
72+
定义状态 $dp[i][j]$ 表示 $s$ 的前 $i$ 个字符和 $p$ 的前 $j$ 个字符是否匹配。
73+
74+
状态转移方程如下:
75+
76+
$$
77+
dp[i][j]=
78+
\begin{cases}
79+
dp[i-1][j-1] & \text{if } s[i-1]=p[j-1] \text{ or } p[j-1]=\text{?} \\
80+
dp[i-1][j-1] \lor dp[i-1][j] \lor dp[i][j-1] & \text{if } p[j-1]=\text{*} \\
81+
\text{false} & \text{otherwise}
82+
\end{cases}
83+
$$
84+
85+
时间复杂度 $O(m\times n)$,空间复杂度 $O(m\times n)$。
86+
7087
<!-- tabs:start -->
7188

7289
### **Python3**
7390

7491
<!-- 这里可写当前语言的特殊实现逻辑 -->
7592

7693
```python
77-
94+
class Solution:
95+
def isMatch(self, s: str, p: str) -> bool:
96+
m, n = len(s), len(p)
97+
dp = [[False] * (n + 1) for _ in range(m + 1)]
98+
dp[0][0] = True
99+
for j in range(1, n + 1):
100+
if p[j - 1] == '*':
101+
dp[0][j] = dp[0][j - 1]
102+
for i in range(1, m + 1):
103+
for j in range(1, n + 1):
104+
if s[i - 1] == p[j - 1] or p[j - 1] == '?':
105+
dp[i][j] = dp[i - 1][j - 1]
106+
elif p[j - 1] == '*':
107+
dp[i][j] = dp[i - 1][j] or dp[i][j - 1]
108+
return dp[m][n]
78109
```
79110

80111
### **Java**
81112

82113
<!-- 这里可写当前语言的特殊实现逻辑 -->
83114

84115
```java
116+
class Solution {
117+
public boolean isMatch(String s, String p) {
118+
int m = s.length(), n = p.length();
119+
boolean[][] dp = new boolean[m + 1][n + 1];
120+
dp[0][0] = true;
121+
for (int j = 1; j <= n; ++j) {
122+
if (p.charAt(j - 1) == '*') {
123+
dp[0][j] = dp[0][j - 1];
124+
}
125+
}
126+
for (int i = 1; i <= m; ++i) {
127+
for (int j = 1; j <= n; ++j) {
128+
if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?') {
129+
dp[i][j] = dp[i - 1][j - 1];
130+
} else if (p.charAt(j - 1) == '*') {
131+
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
132+
}
133+
}
134+
}
135+
return dp[m][n];
136+
}
137+
}
138+
```
139+
140+
### **C++**
141+
142+
```cpp
143+
class Solution {
144+
public:
145+
bool isMatch(string s, string p) {
146+
int m = s.size(), n = p.size();
147+
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
148+
dp[0][0] = true;
149+
for (int j = 1; j <= n; ++j) {
150+
if (p[j - 1] == '*') {
151+
dp[0][j] = dp[0][j - 1];
152+
}
153+
}
154+
for (int i = 1; i <= m; ++i) {
155+
for (int j = 1; j <= n; ++j) {
156+
if (s[i - 1] == p[j - 1] || p[j - 1] == '?') {
157+
dp[i][j] = dp[i - 1][j - 1];
158+
} else if (p[j - 1] == '*') {
159+
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
160+
}
161+
}
162+
}
163+
return dp[m][n];
164+
}
165+
};
166+
```
85167
168+
### **Go**
169+
170+
```go
171+
func isMatch(s string, p string) bool {
172+
m, n := len(s), len(p)
173+
dp := make([][]bool, m+1)
174+
for i := range dp {
175+
dp[i] = make([]bool, n+1)
176+
}
177+
dp[0][0] = true
178+
for j := 1; j <= n; j++ {
179+
if p[j-1] == '*' {
180+
dp[0][j] = dp[0][j-1]
181+
}
182+
}
183+
for i := 1; i <= m; i++ {
184+
for j := 1; j <= n; j++ {
185+
if s[i-1] == p[j-1] || p[j-1] == '?' {
186+
dp[i][j] = dp[i-1][j-1]
187+
} else if p[j-1] == '*' {
188+
dp[i][j] = dp[i-1][j] || dp[i][j-1]
189+
}
190+
}
191+
}
192+
return dp[m][n]
193+
}
86194
```
87195

88196
### **...**

solution/0000-0099/0044.Wildcard Matching/README_EN.md

+92-1
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,104 @@
5454
### **Python3**
5555

5656
```python
57-
57+
class Solution:
58+
def isMatch(self, s: str, p: str) -> bool:
59+
m, n = len(s), len(p)
60+
dp = [[False] * (n + 1) for _ in range(m + 1)]
61+
dp[0][0] = True
62+
for j in range(1, n + 1):
63+
if p[j - 1] == '*':
64+
dp[0][j] = dp[0][j - 1]
65+
for i in range(1, m + 1):
66+
for j in range(1, n + 1):
67+
if s[i - 1] == p[j - 1] or p[j - 1] == '?':
68+
dp[i][j] = dp[i - 1][j - 1]
69+
elif p[j - 1] == '*':
70+
dp[i][j] = dp[i - 1][j] or dp[i][j - 1]
71+
return dp[m][n]
5872
```
5973

6074
### **Java**
6175

6276
```java
77+
class Solution {
78+
public boolean isMatch(String s, String p) {
79+
int m = s.length(), n = p.length();
80+
boolean[][] dp = new boolean[m + 1][n + 1];
81+
dp[0][0] = true;
82+
for (int j = 1; j <= n; ++j) {
83+
if (p.charAt(j - 1) == '*') {
84+
dp[0][j] = dp[0][j - 1];
85+
}
86+
}
87+
for (int i = 1; i <= m; ++i) {
88+
for (int j = 1; j <= n; ++j) {
89+
if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?') {
90+
dp[i][j] = dp[i - 1][j - 1];
91+
} else if (p.charAt(j - 1) == '*') {
92+
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
93+
}
94+
}
95+
}
96+
return dp[m][n];
97+
}
98+
}
99+
```
100+
101+
### **C++**
102+
103+
```cpp
104+
class Solution {
105+
public:
106+
bool isMatch(string s, string p) {
107+
int m = s.size(), n = p.size();
108+
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
109+
dp[0][0] = true;
110+
for (int j = 1; j <= n; ++j) {
111+
if (p[j - 1] == '*') {
112+
dp[0][j] = dp[0][j - 1];
113+
}
114+
}
115+
for (int i = 1; i <= m; ++i) {
116+
for (int j = 1; j <= n; ++j) {
117+
if (s[i - 1] == p[j - 1] || p[j - 1] == '?') {
118+
dp[i][j] = dp[i - 1][j - 1];
119+
} else if (p[j - 1] == '*') {
120+
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
121+
}
122+
}
123+
}
124+
return dp[m][n];
125+
}
126+
};
127+
```
63128
129+
### **Go**
130+
131+
```go
132+
func isMatch(s string, p string) bool {
133+
m, n := len(s), len(p)
134+
dp := make([][]bool, m+1)
135+
for i := range dp {
136+
dp[i] = make([]bool, n+1)
137+
}
138+
dp[0][0] = true
139+
for j := 1; j <= n; j++ {
140+
if p[j-1] == '*' {
141+
dp[0][j] = dp[0][j-1]
142+
}
143+
}
144+
for i := 1; i <= m; i++ {
145+
for j := 1; j <= n; j++ {
146+
if s[i-1] == p[j-1] || p[j-1] == '?' {
147+
dp[i][j] = dp[i-1][j-1]
148+
} else if p[j-1] == '*' {
149+
dp[i][j] = dp[i-1][j] || dp[i][j-1]
150+
}
151+
}
152+
}
153+
return dp[m][n]
154+
}
64155
```
65156

66157
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
bool isMatch(string s, string p) {
4+
int m = s.size(), n = p.size();
5+
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
6+
dp[0][0] = true;
7+
for (int j = 1; j <= n; ++j) {
8+
if (p[j - 1] == '*') {
9+
dp[0][j] = dp[0][j - 1];
10+
}
11+
}
12+
for (int i = 1; i <= m; ++i) {
13+
for (int j = 1; j <= n; ++j) {
14+
if (s[i - 1] == p[j - 1] || p[j - 1] == '?') {
15+
dp[i][j] = dp[i - 1][j - 1];
16+
} else if (p[j - 1] == '*') {
17+
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
18+
}
19+
}
20+
}
21+
return dp[m][n];
22+
}
23+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func isMatch(s string, p string) bool {
2+
m, n := len(s), len(p)
3+
dp := make([][]bool, m+1)
4+
for i := range dp {
5+
dp[i] = make([]bool, n+1)
6+
}
7+
dp[0][0] = true
8+
for j := 1; j <= n; j++ {
9+
if p[j-1] == '*' {
10+
dp[0][j] = dp[0][j-1]
11+
}
12+
}
13+
for i := 1; i <= m; i++ {
14+
for j := 1; j <= n; 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+
dp[i][j] = dp[i-1][j] || dp[i][j-1]
19+
}
20+
}
21+
}
22+
return dp[m][n]
23+
}
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
class Solution {
22
public boolean isMatch(String s, String p) {
3-
int i = 0, j = 0, is = -1, ip = -1;
4-
char[] ss = s.toCharArray();
5-
char[] pp = p.toCharArray();
6-
while (i < ss.length) {
7-
if (j < pp.length && (ss[i] == pp[j] || pp[j] == '?')) {
8-
i++;
9-
j++;
10-
} else if (j < pp.length && pp[j] == '*') {
11-
ip = j++;
12-
is = i;
13-
} else if (ip != -1) {
14-
j = ip + 1;
15-
i = ++is;
16-
} else
17-
return false;
3+
int m = s.length(), n = p.length();
4+
boolean[][] dp = new boolean[m + 1][n + 1];
5+
dp[0][0] = true;
6+
for (int j = 1; j <= n; ++j) {
7+
if (p.charAt(j - 1) == '*') {
8+
dp[0][j] = dp[0][j - 1];
9+
}
1810
}
19-
while (j < pp.length && pp[j] == '*') j++;
20-
return j == p.length();
11+
for (int i = 1; i <= m; ++i) {
12+
for (int j = 1; j <= n; ++j) {
13+
if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?') {
14+
dp[i][j] = dp[i - 1][j - 1];
15+
} else if (p.charAt(j - 1) == '*') {
16+
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
17+
}
18+
}
19+
}
20+
return dp[m][n];
2121
}
2222
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def isMatch(self, s: str, p: str) -> bool:
3+
m, n = len(s), len(p)
4+
dp = [[False] * (n + 1) for _ in range(m + 1)]
5+
dp[0][0] = True
6+
for j in range(1, n + 1):
7+
if p[j - 1] == '*':
8+
dp[0][j] = dp[0][j - 1]
9+
for i in range(1, m + 1):
10+
for j in range(1, n + 1):
11+
if s[i - 1] == p[j - 1] or p[j - 1] == '?':
12+
dp[i][j] = dp[i - 1][j - 1]
13+
elif p[j - 1] == '*':
14+
dp[i][j] = dp[i - 1][j] or dp[i][j - 1]
15+
return dp[m][n]

0 commit comments

Comments
 (0)