|
| 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