|
| 1 | +/** |
| 2 | + * ๋ฌธ์์ด s์์ ๋ฌธ์์ด t์ ๋ชจ๋ ๋ฌธ์(์ค๋ณต ํฌํจ)๋ฅผ ํฌํจํ๋ ๊ฐ์ฅ ์งง์ ๋ถ๋ถ ๋ฌธ์์ด์ ์ฐพ๋ ๋ฌธ์ |
| 3 | + * ์๊ฐ๋ณต์ก๋: O(m + n), ๊ณต๊ฐ๋ณต์ก๋: O(m + n) |
| 4 | + */ |
| 5 | + |
| 6 | +/** |
| 7 | + * @param {string} s |
| 8 | + * @param {string} t |
| 9 | + * @return {string} |
| 10 | + */ |
| 11 | +var minWindow = function (s, t) { |
| 12 | + if (s.length < t.length) return ''; |
| 13 | + |
| 14 | + // t์ ๊ฐ ๋ฌธ์๋ณ ํ์ํ ๊ฐ์๋ฅผ Map์ผ๋ก ์ ์ฅ |
| 15 | + const need = new Map(); |
| 16 | + for (let char of t) { |
| 17 | + need.set(char, (need.get(char) || 0) + 1); |
| 18 | + } |
| 19 | + |
| 20 | + let left = 0; |
| 21 | + let right = 0; |
| 22 | + let valid = 0; // ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฌธ์ ์ข
๋ฅ ์ |
| 23 | + let minLen = Infinity; |
| 24 | + let start = 0; |
| 25 | + |
| 26 | + // ํ์ฌ ์๋์ฐ์ ๋ฌธ์๋ณ ๊ฐ์ |
| 27 | + const window = new Map(); |
| 28 | + |
| 29 | + while (right < s.length) { |
| 30 | + // ์๋์ฐ์ ๋ฌธ์ ์ถ๊ฐ |
| 31 | + const rightChar = s[right]; |
| 32 | + right++; |
| 33 | + |
| 34 | + // ํ์ํ ๋ฌธ์์ธ ๊ฒฝ์ฐ์๋ง ์ฒ๋ฆฌ |
| 35 | + if (need.has(rightChar)) { |
| 36 | + window.set(rightChar, (window.get(rightChar) || 0) + 1); |
| 37 | + if (window.get(rightChar) === need.get(rightChar)) { |
| 38 | + valid++; |
| 39 | + } |
| 40 | + } |
| 41 | + |
| 42 | + // ์๋์ฐ ์ถ์ ์๋ |
| 43 | + while (valid === need.size) { |
| 44 | + // ๋ ์์ ์๋์ฐ ๋ฐ๊ฒฌ์ ์
๋ฐ์ดํธ |
| 45 | + if (right - left < minLen) { |
| 46 | + start = left; |
| 47 | + minLen = right - left; |
| 48 | + } |
| 49 | + |
| 50 | + // left๋ฅผ ์ด๋์ํค๋ฉฐ ์๋์ฐ์์ ๋ฌธ์ ์ ๊ฑฐ |
| 51 | + const leftChar = s[left]; |
| 52 | + left++; |
| 53 | + |
| 54 | + if (need.has(leftChar)) { |
| 55 | + if (window.get(leftChar) === need.get(leftChar)) { |
| 56 | + valid--; |
| 57 | + } |
| 58 | + window.set(leftChar, window.get(leftChar) - 1); |
| 59 | + } |
| 60 | + } |
| 61 | + } |
| 62 | + |
| 63 | + return minLen === Infinity ? '' : s.substring(start, start + minLen); |
| 64 | +}; |
0 commit comments