Skip to content

Commit 5b93556

Browse files
authored
feat: add solutions to lc problem: No.0727 (doocs#1432)
No.0727.Minimum Window Subsequence
1 parent d27dd26 commit 5b93556

File tree

7 files changed

+448
-2
lines changed

7 files changed

+448
-2
lines changed

solution/0700-0799/0727.Minimum Window Subsequence/README.md

+166-1
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,187 @@ S = "abcdebdde", T = "bde"
3535

3636
<!-- 这里可写通用的实现逻辑 -->
3737

38+
**方法一:动态规划**
39+
40+
我们定义 $f[i][j]$ 表示字符串 $s1$ 的前 $i$ 个字符包含字符串 $s2$ 的前 $j$ 个字符时的最短子串的起始位置,如果不存在则为 $0$。
41+
42+
我们可以得到状态转移方程:
43+
44+
$$
45+
f[i][j] = \begin{cases}
46+
i, & j = 1 \text{ and } s1[i-1] = s2[j] \\
47+
f[i - 1][j - 1], & j > 1 \text{ and } s1[i-1] = s2[j-1] \\
48+
f[i - 1][j], & s1[i-1] \ne s2[j-1]
49+
\end{cases}
50+
$$
51+
52+
接下来我们只需要遍历 $s1$,如果 $f[i][n] \gt 0$,则更新最短子串的起始位置和长度。最后返回最短子串即可。
53+
54+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为字符串 $s1$ 和 $s2$ 的长度。
55+
3856
<!-- tabs:start -->
3957

4058
### **Python3**
4159

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

4462
```python
45-
63+
class Solution:
64+
def minWindow(self, s1: str, s2: str) -> str:
65+
m, n = len(s1), len(s2)
66+
f = [[0] * (n + 1) for _ in range(m + 1)]
67+
for i, a in enumerate(s1, 1):
68+
for j, b in enumerate(s2, 1):
69+
if a == b:
70+
f[i][j] = i if j == 1 else f[i - 1][j - 1]
71+
else:
72+
f[i][j] = f[i - 1][j]
73+
p, k = 0, m + 1
74+
for i, a in enumerate(s1, 1):
75+
if a == s2[n - 1] and f[i][n]:
76+
j = f[i][n] - 1
77+
if i - j < k:
78+
k = i - j
79+
p = j
80+
return "" if k > m else s1[p : p + k]
4681
```
4782

4883
### **Java**
4984

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

5287
```java
88+
class Solution {
89+
public String minWindow(String s1, String s2) {
90+
int m = s1.length(), n = s2.length();
91+
int[][] f = new int[m + 1][n + 1];
92+
for (int i = 1; i <= m; ++i) {
93+
for (int j = 1; j <= n; ++j) {
94+
if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
95+
f[i][j] = j == 1 ? i : f[i - 1][j - 1];
96+
} else {
97+
f[i][j] = f[i - 1][j];
98+
}
99+
}
100+
}
101+
int p = 0, k = m + 1;
102+
for (int i = 1; i <= m; ++i) {
103+
if (s1.charAt(i - 1) == s2.charAt(n - 1) && f[i][n] > 0) {
104+
int j = f[i][n] - 1;
105+
if (i - j < k) {
106+
k = i - j;
107+
p = j;
108+
}
109+
}
110+
}
111+
return k > m ? "" : s1.substring(p, p + k);
112+
}
113+
}
114+
```
115+
116+
### **C++**
117+
118+
```cpp
119+
class Solution {
120+
public:
121+
string minWindow(string s1, string s2) {
122+
int m = s1.size(), n = s2.size();
123+
int f[m + 1][n + 1];
124+
memset(f, 0, sizeof(f));
125+
for (int i = 1; i <= m; ++i) {
126+
for (int j = 1; j <= n; ++j) {
127+
if (s1[i - 1] == s2[j - 1]) {
128+
f[i][j] = j == 1 ? i : f[i - 1][j - 1];
129+
} else {
130+
f[i][j] = f[i - 1][j];
131+
}
132+
}
133+
}
134+
int p = 0, k = m + 1;
135+
for (int i = 1; i <= m; ++i) {
136+
if (s1[i - 1] == s2[n - 1] && f[i][n]) {
137+
int j = f[i][n] - 1;
138+
if (i - j < k) {
139+
k = i - j;
140+
p = j;
141+
}
142+
}
143+
}
144+
return k > m ? "" : s1.substr(p, k);
145+
}
146+
};
147+
```
148+
149+
### **Go**
150+
151+
```go
152+
func minWindow(s1 string, s2 string) string {
153+
m, n := len(s1), len(s2)
154+
f := make([][]int, m+1)
155+
for i := range f {
156+
f[i] = make([]int, n+1)
157+
}
158+
for i := 1; i <= m; i++ {
159+
for j := 1; j <= n; j++ {
160+
if s1[i-1] == s2[j-1] {
161+
if j == 1 {
162+
f[i][j] = i
163+
} else {
164+
f[i][j] = f[i-1][j-1]
165+
}
166+
} else {
167+
f[i][j] = f[i-1][j]
168+
}
169+
}
170+
}
171+
p, k := 0, m+1
172+
for i := 1; i <= m; i++ {
173+
if s1[i-1] == s2[n-1] && f[i][n] > 0 {
174+
j := f[i][n] - 1
175+
if i-j < k {
176+
k = i - j
177+
p = j
178+
}
179+
}
180+
}
181+
if k > m {
182+
return ""
183+
}
184+
return s1[p : p+k]
185+
}
186+
```
53187

188+
### **TypeScript**
189+
190+
```ts
191+
function minWindow(s1: string, s2: string): string {
192+
const m = s1.length;
193+
const n = s2.length;
194+
const f: number[][] = Array(m + 1)
195+
.fill(0)
196+
.map(() => Array(n + 1).fill(0));
197+
for (let i = 1; i <= m; ++i) {
198+
for (let j = 1; j <= n; ++j) {
199+
if (s1[i - 1] === s2[j - 1]) {
200+
f[i][j] = j === 1 ? i : f[i - 1][j - 1];
201+
} else {
202+
f[i][j] = f[i - 1][j];
203+
}
204+
}
205+
}
206+
let p = 0;
207+
let k = m + 1;
208+
for (let i = 1; i <= m; ++i) {
209+
if (s1[i - 1] === s2[n - 1] && f[i][n]) {
210+
const j = f[i][n] - 1;
211+
if (i - j < k) {
212+
k = i - j;
213+
p = j;
214+
}
215+
}
216+
}
217+
return k > m ? '' : s1.slice(p, p + k);
218+
}
54219
```
55220

56221
### **...**

solution/0700-0799/0727.Minimum Window Subsequence/README_EN.md

+148-1
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,160 @@
4242
### **Python3**
4343

4444
```python
45-
45+
class Solution:
46+
def minWindow(self, s1: str, s2: str) -> str:
47+
m, n = len(s1), len(s2)
48+
f = [[0] * (n + 1) for _ in range(m + 1)]
49+
for i, a in enumerate(s1, 1):
50+
for j, b in enumerate(s2, 1):
51+
if a == b:
52+
f[i][j] = i if j == 1 else f[i - 1][j - 1]
53+
else:
54+
f[i][j] = f[i - 1][j]
55+
p, k = 0, m + 1
56+
for i, a in enumerate(s1, 1):
57+
if a == s2[n - 1] and f[i][n]:
58+
j = f[i][n] - 1
59+
if i - j < k:
60+
k = i - j
61+
p = j
62+
return "" if k > m else s1[p : p + k]
4663
```
4764

4865
### **Java**
4966

5067
```java
68+
class Solution {
69+
public String minWindow(String s1, String s2) {
70+
int m = s1.length(), n = s2.length();
71+
int[][] f = new int[m + 1][n + 1];
72+
for (int i = 1; i <= m; ++i) {
73+
for (int j = 1; j <= n; ++j) {
74+
if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
75+
f[i][j] = j == 1 ? i : f[i - 1][j - 1];
76+
} else {
77+
f[i][j] = f[i - 1][j];
78+
}
79+
}
80+
}
81+
int p = 0, k = m + 1;
82+
for (int i = 1; i <= m; ++i) {
83+
if (s1.charAt(i - 1) == s2.charAt(n - 1) && f[i][n] > 0) {
84+
int j = f[i][n] - 1;
85+
if (i - j < k) {
86+
k = i - j;
87+
p = j;
88+
}
89+
}
90+
}
91+
return k > m ? "" : s1.substring(p, p + k);
92+
}
93+
}
94+
```
95+
96+
### **C++**
97+
98+
```cpp
99+
class Solution {
100+
public:
101+
string minWindow(string s1, string s2) {
102+
int m = s1.size(), n = s2.size();
103+
int f[m + 1][n + 1];
104+
memset(f, 0, sizeof(f));
105+
for (int i = 1; i <= m; ++i) {
106+
for (int j = 1; j <= n; ++j) {
107+
if (s1[i - 1] == s2[j - 1]) {
108+
f[i][j] = j == 1 ? i : f[i - 1][j - 1];
109+
} else {
110+
f[i][j] = f[i - 1][j];
111+
}
112+
}
113+
}
114+
int p = 0, k = m + 1;
115+
for (int i = 1; i <= m; ++i) {
116+
if (s1[i - 1] == s2[n - 1] && f[i][n]) {
117+
int j = f[i][n] - 1;
118+
if (i - j < k) {
119+
k = i - j;
120+
p = j;
121+
}
122+
}
123+
}
124+
return k > m ? "" : s1.substr(p, k);
125+
}
126+
};
127+
```
128+
129+
### **Go**
130+
131+
```go
132+
func minWindow(s1 string, s2 string) string {
133+
m, n := len(s1), len(s2)
134+
f := make([][]int, m+1)
135+
for i := range f {
136+
f[i] = make([]int, n+1)
137+
}
138+
for i := 1; i <= m; i++ {
139+
for j := 1; j <= n; j++ {
140+
if s1[i-1] == s2[j-1] {
141+
if j == 1 {
142+
f[i][j] = i
143+
} else {
144+
f[i][j] = f[i-1][j-1]
145+
}
146+
} else {
147+
f[i][j] = f[i-1][j]
148+
}
149+
}
150+
}
151+
p, k := 0, m+1
152+
for i := 1; i <= m; i++ {
153+
if s1[i-1] == s2[n-1] && f[i][n] > 0 {
154+
j := f[i][n] - 1
155+
if i-j < k {
156+
k = i - j
157+
p = j
158+
}
159+
}
160+
}
161+
if k > m {
162+
return ""
163+
}
164+
return s1[p : p+k]
165+
}
166+
```
51167

168+
### **TypeScript**
169+
170+
```ts
171+
function minWindow(s1: string, s2: string): string {
172+
const m = s1.length;
173+
const n = s2.length;
174+
const f: number[][] = Array(m + 1)
175+
.fill(0)
176+
.map(() => Array(n + 1).fill(0));
177+
for (let i = 1; i <= m; ++i) {
178+
for (let j = 1; j <= n; ++j) {
179+
if (s1[i - 1] === s2[j - 1]) {
180+
f[i][j] = j === 1 ? i : f[i - 1][j - 1];
181+
} else {
182+
f[i][j] = f[i - 1][j];
183+
}
184+
}
185+
}
186+
let p = 0;
187+
let k = m + 1;
188+
for (let i = 1; i <= m; ++i) {
189+
if (s1[i - 1] === s2[n - 1] && f[i][n]) {
190+
const j = f[i][n] - 1;
191+
if (i - j < k) {
192+
k = i - j;
193+
p = j;
194+
}
195+
}
196+
}
197+
return k > m ? '' : s1.slice(p, p + k);
198+
}
52199
```
53200

54201
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public:
3+
string minWindow(string s1, string s2) {
4+
int m = s1.size(), n = s2.size();
5+
int f[m + 1][n + 1];
6+
memset(f, 0, sizeof(f));
7+
for (int i = 1; i <= m; ++i) {
8+
for (int j = 1; j <= n; ++j) {
9+
if (s1[i - 1] == s2[j - 1]) {
10+
f[i][j] = j == 1 ? i : f[i - 1][j - 1];
11+
} else {
12+
f[i][j] = f[i - 1][j];
13+
}
14+
}
15+
}
16+
int p = 0, k = m + 1;
17+
for (int i = 1; i <= m; ++i) {
18+
if (s1[i - 1] == s2[n - 1] && f[i][n]) {
19+
int j = f[i][n] - 1;
20+
if (i - j < k) {
21+
k = i - j;
22+
p = j;
23+
}
24+
}
25+
}
26+
return k > m ? "" : s1.substr(p, k);
27+
}
28+
};

0 commit comments

Comments
 (0)