Skip to content

Commit f6e95c8

Browse files
committed
minimum-window-substring solution
1 parent 550375d commit f6e95c8

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/**
2+
* @param {string} s
3+
* @param {string} t
4+
* @return {string}
5+
*/
6+
var minWindow = function (s, t) {
7+
let start = 0;
8+
let end = 0;
9+
10+
/** t์˜ ๋ชจ๋“  ๋ฌธ์ž์—ด์ด ์Šฌ๋ผ์ด๋“œ ์œˆ๋„์šฐ์˜ ๋ฒ”์œ„์— ๋“ค์–ด์™”์„ ๋•Œ, ๊ทธ ๋ฒ”์œ„์˜ ์ตœ์†Œ ๊ธธ์ด */
11+
let min = s.length;
12+
13+
/** while ๋ฌธ์ด ํ•œ ๋ฒˆ ์ˆœํšŒํ•  ๋•Œ, start ๋˜๋Š” end๊ฐ’ ์ค‘ end๊ฐ’์ด ์ฆ๊ฐ€ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€ */
14+
let isEndIndexUp = true;
15+
16+
/** min ๊ฐ’์ด ๊ฐฑ์‹ ๋˜๋ฉด s๋ฌธ์ž์—ด์˜ start, end ์ธ๋ฑ์Šค๊ฐ’์„ ์ €์žฅํ•  ๋ณ€์ˆ˜ */
17+
let index = null;
18+
19+
/** ๋ฌธ์ž์—ด t๊ฐ€ ๋ณด์œ ํ•œ ๋ฌธ์ž์™€ ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์ˆ˜๋ฅผ key, value๋กœ ์„ค์ •ํ•œ map๊ฐ์ฒด */
20+
const charMap = t.split('').reduce((acc, cur) => {
21+
if (acc.has(cur)) {
22+
acc.set(cur, acc.get(cur) + 1);
23+
} else {
24+
acc.set(cur, 1);
25+
}
26+
27+
return acc;
28+
}, new Map());
29+
30+
while (end < s.length) {
31+
const curChar = s[end];
32+
33+
if (isEndIndexUp && t.includes(curChar)) {
34+
// end๊ฐ€ ์ฆ๊ฐ๋˜์—ˆ๊ณ  s์˜ end ์ธ๋ฑ์Šค์˜ ๋ฌธ์ž๊ฐ€ t์— ์กด์žฌํ•œ๋‹ค๋ฉด ํ•ด๋‹น ํ‚ค์˜ ๊ฐ’์— 1์„ ๊ฐ์†Œ
35+
charMap.set(curChar, charMap.get(curChar) - 1);
36+
}
37+
38+
/** ๋ชจ๋“  t์˜ ๋ฌธ์ž๋“ค์ด ์Šฌ๋ผ์ด๋“œ ์œˆ๋„์šฐ์˜ ๋ฒ”์œ„์— ๋“ค์–ด์™”๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ถˆ๋ฆฐ๊ฐ’ */
39+
const everyCharCollected = [...charMap].every(([_, value]) => value <= 0);
40+
41+
if (everyCharCollected) {
42+
// ๋ชจ๋“  ๋ฌธ์ž์—ด์ด ์Šฌ๋ผ์ด๋“œ ์œˆ๋„์šฐ์˜ ๋ฌธ์ž์—ด์— ํฌ์ฐฉ๋œ ๊ฒฝ์šฐ
43+
if (t.includes(s[start])) {
44+
// s์˜ start ์ธ๋ฑ์Šค ๋ฌธ์ž๊ฐ€ t์— ์กด์žฌํ•œ๋‹ค๋ฉด charMap์— ํ•ด๋‹น ํ‚ค์˜ ๊ฐ’์— 1์„ ์ฆ๊ฐ
45+
charMap.set(s[start], (charMap.get(s[start]) || 0) + 1);
46+
}
47+
48+
const gap = end - start;
49+
if (gap < min) {
50+
// t์˜ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ์Šฌ๋ผ์ด๋“œ ์œˆ๋„์šฐ์˜ ๋ฒ”์œ„์— ์žˆ๊ณ , ํ˜„์žฌ ๊ทธ ์œˆ๋„์šฐ์˜ ๊ธธ์ด๊ฐ€ ์ด์ „์˜ min๊ฐ’ ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์—…๋ฐ์ดํŠธ
51+
min = gap;
52+
index = [start, end];
53+
}
54+
55+
start++;
56+
isEndIndexUp = false;
57+
} else {
58+
// ์œˆ๋„์šฐ์— ๋ฌธ์ž์—ด์ด ํ•˜๋‚˜๋ผ๋„ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ
59+
end++;
60+
isEndIndexUp = true;
61+
}
62+
}
63+
64+
return index ? s.slice(index[0], index[1] + 1) : '';
65+
};
66+
67+
// ๊ณต๊ฐ„๋ณต์žก๋„ O(t) -> ์ตœ๋Œ€ t์˜ ๊ธธ์ด์— ๋”ฐ๋ผ ๋งต์˜ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๋ฏ€๋กœ
68+
// ์‹œ๊ฐ„๋ณต์žก๋„ O(s * t) -> s๋ฅผ ์ˆœํšŒํ•˜๋Š” while ๋ฌธ์—์„œ ์ตœ๋Œ€ O(t)์˜ ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ ๋”ฐ๋ฅด๋Š” map ๊ฐ์ฒด๊ฐ€ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜๋˜์–ด every ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์—

0 commit comments

Comments
ย (0)