Skip to content
This repository was archived by the owner on Sep 20, 2023. It is now read-only.

Commit 8ec4e67

Browse files
committed
Merge branch 'develop' of https://github.com/aQuaYi/LeetCode-in-Go into develop
2 parents 5618d85 + debef4e commit 8ec4e67

File tree

6 files changed

+205
-212
lines changed

6 files changed

+205
-212
lines changed

Algorithms/0044.wildcard-matching/README.md

+58-11
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,74 @@
11
# [44. Wildcard Matching](https://leetcode.com/problems/wildcard-matching/)
22

33
## 题目
4-
Implement wildcard pattern matching with support for '?' and '*'.
54

5+
Given an input string (`s`) and a pattern (`p`), implement wildcard pattern matching with support for `'?'` and `'*'`.
6+
7+
```text
68
'?' Matches any single character.
79
'*' Matches any sequence of characters (including the empty sequence).
10+
```
811

912
The matching should cover the entire input string (not partial).
1013

11-
The function prototype should be:
12-
bool isMatch(const char *s, const char *p)
14+
Note:
15+
16+
- `s` could be empty and contains only lowercase letters `a-z`.
17+
- `p` could be empty and contains only lowercase letters `a-z`, and characters like `?` or `*`.
18+
19+
Example 1:
20+
21+
```text
22+
Input:
23+
s = "aa"
24+
p = "a"
25+
Output: false
26+
Explanation: "a" does not match the entire string "aa".
27+
```
28+
29+
Example 2:
30+
31+
```text
32+
Input:
33+
s = "aa"
34+
p = "*"
35+
Output: true
36+
Explanation:`'*' matches any sequence.
37+
```
38+
39+
Example 3:
1340

14-
Some examples:
15-
isMatch("aa","a") → false
16-
isMatch("aa","aa") → true
17-
isMatch("aaa","aa") → false
18-
isMatch("aa", "*") → true
19-
isMatch("aa", "a*") → true
20-
isMatch("ab", "?*") → true
21-
isMatch("aab", "c*a*b") → false
41+
```text
42+
Input:
43+
s = "cb"
44+
p = "?a"
45+
Output: false
46+
Explanation:`'?' matches 'c', but the second letter is 'a', which does not match 'b'.
47+
```
48+
49+
Example 4:
50+
51+
```text
52+
Input:
53+
s = "adceb"
54+
p = "*a*b"
55+
Output: true
56+
Explanation:`The first '*' matches the empty sequence, while the second '*' matches the substring "dce".
57+
```
58+
59+
Example 5:
60+
61+
```text
62+
Input:
63+
s = "acdcb"
64+
p = "a*c?b"
65+
Output: false
66+
```
2267

2368
## 解题思路
69+
2470
注意审题:
71+
2572
1. '?' 可以匹配任意一个字符,但是不能匹配空字符""
2673
1. '*' 可以任意多个字符,包括""
2774

Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package problem0044
22

33
func isMatch(s string, p string) bool {
4-
ls, lp := len(s), len(p)
4+
sSize, pSize := len(s), len(p)
55

6-
dp := [][]bool{}
7-
for i := 0; i < ls+1; i++ {
8-
rt := make([]bool, lp+1)
9-
dp = append(dp, rt)
6+
dp := make([][]bool, sSize+1)
7+
for i := range dp {
8+
dp[i] = make([]bool, pSize+1)
109
}
1110
// dp[i][j] == true 意味着,s[:i+1] 可以和 p[:j+1] 匹配
1211
dp[0][0] = true
1312

14-
for j := 1; j <= lp; j++ {
13+
for j := 1; j <= pSize; j++ {
1514
if p[j-1] == '*' {
1615
// 当 p[j-1] == '*' 时
1716
// 只要前面的匹配,dp[0][j] 就匹配
@@ -20,12 +19,13 @@ func isMatch(s string, p string) bool {
2019
}
2120
}
2221

23-
for i := 1; i <= ls; i++ {
24-
for j := 1; j <= lp; j++ {
22+
for i := 1; i <= sSize; i++ {
23+
for j := 1; j <= pSize; j++ {
2524
if p[j-1] != '*' {
2625
// 当 p[j-1] != '*' 时
2726
// 单个字符要匹配,并且之前的字符串也要匹配。
28-
dp[i][j] = (p[j-1] == s[i-1] || p[j-1] == '?') && dp[i-1][j-1]
27+
dp[i][j] = dp[i-1][j-1] &&
28+
(p[j-1] == s[i-1] || p[j-1] == '?')
2929
} else {
3030
// 当 p[j-1] == '*' 时
3131
// 要么,dp[i-1][j] == true,意味着,
@@ -39,5 +39,6 @@ func isMatch(s string, p string) bool {
3939
}
4040
}
4141
}
42-
return dp[ls][lp]
42+
43+
return dp[sSize][pSize]
4344
}

Algorithms/0044.wildcard-matching/wildcard-matching_test.go

+48-102
Original file line numberDiff line numberDiff line change
@@ -7,113 +7,59 @@ import (
77
"github.com/stretchr/testify/assert"
88
)
99

10-
type question struct {
11-
para
12-
ans
10+
// tcs is testcase slice
11+
var tcs = []struct {
12+
s string
13+
p string
14+
ans bool
15+
}{
16+
17+
{
18+
"aa",
19+
"a",
20+
false,
21+
},
22+
23+
{
24+
"aa",
25+
"*",
26+
true,
27+
},
28+
29+
{
30+
"cb",
31+
"?a",
32+
false,
33+
},
34+
35+
{
36+
"adceb",
37+
"*a*b",
38+
true,
39+
},
40+
41+
{
42+
"acdcb",
43+
"a*c?b",
44+
false,
45+
},
46+
47+
// 可以有多个 testcase
1348
}
1449

15-
// para 是参数
16-
type para struct {
17-
s string
18-
p string
19-
}
20-
21-
// ans 是答案
22-
type ans struct {
23-
one bool
24-
}
25-
26-
func Test_Problem0044(t *testing.T) {
50+
func Test_isMatch(t *testing.T) {
2751
ast := assert.New(t)
2852

29-
qs := []question{
30-
31-
question{
32-
para{
33-
"aa",
34-
"a",
35-
},
36-
ans{
37-
false,
38-
},
39-
},
40-
41-
question{
42-
para{
43-
"aa",
44-
"aa",
45-
},
46-
ans{
47-
true,
48-
},
49-
},
50-
51-
question{
52-
para{
53-
"aaa",
54-
"aa",
55-
},
56-
ans{
57-
false,
58-
},
59-
},
60-
61-
question{
62-
para{
63-
"aa",
64-
"*",
65-
},
66-
ans{
67-
true,
68-
},
69-
},
70-
71-
question{
72-
para{
73-
"aa",
74-
"a*",
75-
},
76-
ans{
77-
true,
78-
},
79-
},
80-
81-
question{
82-
para{
83-
"ab",
84-
"?*",
85-
},
86-
ans{
87-
true,
88-
},
89-
},
90-
91-
question{
92-
para{
93-
"aab",
94-
"c*a*b",
95-
},
96-
ans{
97-
false,
98-
},
99-
},
100-
101-
question{
102-
para{
103-
"ab",
104-
"*",
105-
},
106-
ans{
107-
true,
108-
},
109-
},
110-
// 如需多个测试,可以复制上方元素。
53+
for _, tc := range tcs {
54+
fmt.Printf("~~%v~~\n", tc)
55+
ast.Equal(tc.ans, isMatch(tc.s, tc.p), "输入:%v", tc)
11156
}
57+
}
11258

113-
for _, q := range qs {
114-
a, p := q.ans, q.para
115-
fmt.Printf("~~%v~~\n", p)
116-
117-
ast.Equal(a.one, isMatch(p.s, p.p), "输入:%v", p)
59+
func Benchmark_isMatch(b *testing.B) {
60+
for i := 0; i < b.N; i++ {
61+
for _, tc := range tcs {
62+
isMatch(tc.s, tc.p)
63+
}
11864
}
11965
}

Favorite.md

+8-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
|题号|题目|通过率|难度|收藏|
44
|:-:|:-|:-: | :-: | :-: |
5-
|44|[Wildcard Matching](./Algorithms/0044.wildcard-matching)|21%|Hard|[](https://leetcode.com/list/oussv5j)|
65
|49|[Group Anagrams](./Algorithms/0049.group-anagrams)|41%|Medium|[](https://leetcode.com/list/oussv5j)|
76
|53|[Maximum Subarray](./Algorithms/0053.maximum-subarray)|41%|Easy|[](https://leetcode.com/list/oussv5j)|
87
|54|[Spiral Matrix](./Algorithms/0054.spiral-matrix)|28%|Medium|[](https://leetcode.com/list/oussv5j)|
@@ -62,7 +61,7 @@
6261
|205|[Isomorphic Strings](./Algorithms/0205.isomorphic-strings)|35%|Easy|[](https://leetcode.com/list/oussv5j)|
6362
|207|[Course Schedule](./Algorithms/0207.course-schedule)|34%|Medium|[](https://leetcode.com/list/oussv5j)|
6463
|208|[Implement Trie (Prefix Tree)](./Algorithms/0208.implement-trie-prefix-tree)|33%|Medium|[](https://leetcode.com/list/oussv5j)|
65-
|211|[Add and Search Word - Data structure design](./Algorithms/0211.add-and-search-word-data-structure-design)|26%|Medium|[](https://leetcode.com/list/oussv5j)|
64+
|211|[Add and Search Word - Data structure design](./Algorithms/0211.add-and-search-word-data-structure-design)|27%|Medium|[](https://leetcode.com/list/oussv5j)|
6665
|212|[Word Search II](./Algorithms/0212.word-search-ii)|25%|Hard|[](https://leetcode.com/list/oussv5j)|
6766
|214|[Shortest Palindrome](./Algorithms/0214.shortest-palindrome)|25%|Hard|[](https://leetcode.com/list/oussv5j)|
6867
|215|[Kth Largest Element in an Array](./Algorithms/0215.kth-largest-element-in-an-array)|42%|Medium|[](https://leetcode.com/list/oussv5j)|
@@ -127,7 +126,7 @@
127126
|400|[Nth Digit](./Algorithms/0400.nth-digit)|29%|Easy|[](https://leetcode.com/list/oussv5j)|
128127
|402|[Remove K Digits](./Algorithms/0402.remove-k-digits)|25%|Medium|[](https://leetcode.com/list/oussv5j)|
129128
|403|[Frog Jump](./Algorithms/0403.frog-jump)|33%|Hard|[](https://leetcode.com/list/oussv5j)|
130-
|406|[Queue Reconstruction by Height](./Algorithms/0406.queue-reconstruction-by-height)|56%|Medium|[](https://leetcode.com/list/oussv5j)|
129+
|406|[Queue Reconstruction by Height](./Algorithms/0406.queue-reconstruction-by-height)|57%|Medium|[](https://leetcode.com/list/oussv5j)|
131130
|416|[Partition Equal Subset Sum](./Algorithms/0416.partition-equal-subset-sum)|38%|Medium|[](https://leetcode.com/list/oussv5j)|
132131
|420|[Strong Password Checker](./Algorithms/0420.strong-password-checker)|18%|Hard|[](https://leetcode.com/list/oussv5j)|
133132
|421|[Maximum XOR of Two Numbers in an Array](./Algorithms/0421.maximum-xor-of-two-numbers-in-an-array)|49%|Medium|[](https://leetcode.com/list/oussv5j)|
@@ -158,7 +157,7 @@
158157
|503|[Next Greater Element II](./Algorithms/0503.next-greater-element-ii)|48%|Medium|[](https://leetcode.com/list/oussv5j)|
159158
|516|[Longest Palindromic Subsequence](./Algorithms/0516.longest-palindromic-subsequence)|43%|Medium|[](https://leetcode.com/list/oussv5j)|
160159
|517|[Super Washing Machines](./Algorithms/0517.super-washing-machines)|36%|Hard|[](https://leetcode.com/list/oussv5j)|
161-
|518|[Coin Change 2](./Algorithms/0518.coin-change-2)|37%|Medium|[](https://leetcode.com/list/oussv5j)|
160+
|518|[Coin Change 2](./Algorithms/0518.coin-change-2)|38%|Medium|[](https://leetcode.com/list/oussv5j)|
162161
|523|[Continuous Subarray Sum](./Algorithms/0523.continuous-subarray-sum)|23%|Medium|[](https://leetcode.com/list/oussv5j)|
163162
|525|[Contiguous Array](./Algorithms/0525.contiguous-array)|41%|Medium|[](https://leetcode.com/list/oussv5j)|
164163
|526|[Beautiful Arrangement](./Algorithms/0526.beautiful-arrangement)|52%|Medium|[](https://leetcode.com/list/oussv5j)|
@@ -209,7 +208,7 @@
209208
|718|[Maximum Length of Repeated Subarray](./Algorithms/0718.maximum-length-of-repeated-subarray)|42%|Medium|[](https://leetcode.com/list/oussv5j)|
210209
|719|[Find K-th Smallest Pair Distance](./Algorithms/0719.find-k-th-smallest-pair-distance)|28%|Hard|[](https://leetcode.com/list/oussv5j)|
211210
|721|[Accounts Merge](./Algorithms/0721.accounts-merge)|35%|Medium|[](https://leetcode.com/list/oussv5j)|
212-
|722|[Remove Comments](./Algorithms/0722.remove-comments)|28%|Medium|[](https://leetcode.com/list/oussv5j)|
211+
|722|[Remove Comments](./Algorithms/0722.remove-comments)|29%|Medium|[](https://leetcode.com/list/oussv5j)|
213212
|726|[Number of Atoms](./Algorithms/0726.number-of-atoms)|43%|Hard|[](https://leetcode.com/list/oussv5j)|
214213
|730|[Count Different Palindromic Subsequences](./Algorithms/0730.count-different-palindromic-subsequences)|36%|Hard|[](https://leetcode.com/list/oussv5j)|
215214
|731|[My Calendar II](./Algorithms/0731.my-calendar-ii)|39%|Medium|[](https://leetcode.com/list/oussv5j)|
@@ -223,7 +222,7 @@
223222
|770|[Basic Calculator IV](./Algorithms/0770.basic-calculator-iv)|41%|Hard|[](https://leetcode.com/list/oussv5j)|
224223
|784|[Letter Case Permutation](./Algorithms/0784.letter-case-permutation)|53%|Easy|[](https://leetcode.com/list/oussv5j)|
225224
|785|[Is Graph Bipartite?](./Algorithms/0785.is-graph-bipartite)|39%|Medium|[](https://leetcode.com/list/oussv5j)|
226-
|786|[K-th Smallest Prime Fraction](./Algorithms/0786.k-th-smallest-prime-fraction)|34%|Hard|[](https://leetcode.com/list/oussv5j)|
225+
|786|[K-th Smallest Prime Fraction](./Algorithms/0786.k-th-smallest-prime-fraction)|35%|Hard|[](https://leetcode.com/list/oussv5j)|
227226
|787|[Cheapest Flights Within K Stops](./Algorithms/0787.cheapest-flights-within-k-stops)|30%|Medium|[](https://leetcode.com/list/oussv5j)|
228227
|790|[Domino and Tromino Tiling](./Algorithms/0790.domino-and-tromino-tiling)|33%|Medium|[](https://leetcode.com/list/oussv5j)|
229228
|792|[Number of Matching Subsequences](./Algorithms/0792.number-of-matching-subsequences)|37%|Medium|[](https://leetcode.com/list/oussv5j)|
@@ -243,7 +242,7 @@
243242
|826|[Most Profit Assigning Work](./Algorithms/0826.most-profit-assigning-work)|32%|Medium|[](https://leetcode.com/list/oussv5j)|
244243
|827|[Making A Large Island](./Algorithms/0827.making-a-large-island)|40%|Hard|[](https://leetcode.com/list/oussv5j)|
245244
|828|[Unique Letter String](./Algorithms/0828.unique-letter-string)|35%|Hard|[](https://leetcode.com/list/oussv5j)|
246-
|829|[Consecutive Numbers Sum](./Algorithms/0829.consecutive-numbers-sum)|27%|Medium|[](https://leetcode.com/list/oussv5j)|
245+
|829|[Consecutive Numbers Sum](./Algorithms/0829.consecutive-numbers-sum)|28%|Medium|[](https://leetcode.com/list/oussv5j)|
247246
|834|[Sum of Distances in Tree](./Algorithms/0834.sum-of-distances-in-tree)|33%|Hard|[](https://leetcode.com/list/oussv5j)|
248247
|837|[New 21 Game](./Algorithms/0837.new-21-game)|26%|Medium|[](https://leetcode.com/list/oussv5j)|
249248
|838|[Push Dominoes](./Algorithms/0838.push-dominoes)|41%|Medium|[](https://leetcode.com/list/oussv5j)|
@@ -252,11 +251,11 @@
252251
|846|[Hand of Straights](./Algorithms/0846.hand-of-straights)|44%|Medium|[](https://leetcode.com/list/oussv5j)|
253252
|847|[Shortest Path Visiting All Nodes](./Algorithms/0847.shortest-path-visiting-all-nodes)|43%|Hard|[](https://leetcode.com/list/oussv5j)|
254253
|849|[Maximize Distance to Closest Person](./Algorithms/0849.maximize-distance-to-closest-person)|38%|Easy|[](https://leetcode.com/list/oussv5j)|
255-
|850|[Rectangle Area II](./Algorithms/0850.rectangle-area-ii)|42%|Hard|[](https://leetcode.com/list/oussv5j)|
254+
|850|[Rectangle Area II](./Algorithms/0850.rectangle-area-ii)|41%|Hard|[](https://leetcode.com/list/oussv5j)|
256255
|851|[Loud and Rich](./Algorithms/0851.loud-and-rich)|44%|Medium|[](https://leetcode.com/list/oussv5j)|
257256
|852|[Peak Index in a Mountain Array](./Algorithms/0852.peak-index-in-a-mountain-array)|67%|Easy|[](https://leetcode.com/list/oussv5j)|
258257
|854|[K-Similar Strings](./Algorithms/0854.k-similar-strings)|30%|Hard|[](https://leetcode.com/list/oussv5j)|
259-
|857|[Minimum Cost to Hire K Workers](./Algorithms/0857.minimum-cost-to-hire-k-workers)|41%|Hard|[](https://leetcode.com/list/oussv5j)|
258+
|857|[Minimum Cost to Hire K Workers](./Algorithms/0857.minimum-cost-to-hire-k-workers)|42%|Hard|[](https://leetcode.com/list/oussv5j)|
260259
|862|[Shortest Subarray with Sum at Least K](./Algorithms/0862.shortest-subarray-with-sum-at-least-k)|18%|Hard|[](https://leetcode.com/list/oussv5j)|
261260
|863|[All Nodes Distance K in Binary Tree](./Algorithms/0863.all-nodes-distance-k-in-binary-tree)|41%|Medium|[](https://leetcode.com/list/oussv5j)|
262261
|864|[Shortest Path to Get All Keys](./Algorithms/0864.shortest-path-to-get-all-keys)|32%|Hard|[](https://leetcode.com/list/oussv5j)|

0 commit comments

Comments
 (0)