Skip to content

Commit c683a1c

Browse files
committed
feat(soobing): week9 > minimum-window-substring
1 parent 67e7fac commit c683a1c

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* 문제 설명
3+
* - 주어진 문자열 s에서 주어진 문자열 t의 모든 문자를 포함하는 최소 윈도우를 찾는 문제
4+
*
5+
* 아이디어
6+
* - 슬라이딩 윈도우 + 해시맵(need, window)을 이용하여 풀이한다.
7+
* - 오른쪽 포인터를 먼저 이동하고, 이미 모두 포함되어 있는 경우 왼쪽 포인터를 이동하여 최소 윈도우를 찾는다.
8+
*
9+
*/
10+
function minWindow(s: string, t: string): string {
11+
if (t.length > s.length) return "";
12+
13+
const need = new Map<string, number>();
14+
const window = new Map<string, number>();
15+
16+
for (const char of t) {
17+
need.set(char, (need.get(char) || 0) + 1);
18+
}
19+
20+
let have = 0;
21+
let needSize = need.size;
22+
let res = [-1, -1];
23+
let resLen = Infinity;
24+
25+
let left = 0;
26+
27+
for (let right = 0; right < s.length; right++) {
28+
const c = s[right];
29+
window.set(c, (window.get(c) || 0) + 1);
30+
31+
if (need.has(c) && window.get(c) === need.get(c)) {
32+
have++;
33+
}
34+
35+
while (have === needSize) {
36+
const currentResLen = right - left + 1;
37+
if (currentResLen < resLen) {
38+
res = [left, right];
39+
resLen = currentResLen;
40+
}
41+
42+
const lChar = s[left];
43+
window.set(lChar, window.get(lChar)! - 1);
44+
45+
if (need.has(lChar) && window.get(lChar)! < need.get(lChar)!) {
46+
have--;
47+
}
48+
left++;
49+
}
50+
}
51+
52+
const [start, end] = res;
53+
return resLen === Infinity ? "" : s.slice(start, end + 1);
54+
}

0 commit comments

Comments
 (0)