|
| 1 | +''' |
| 2 | +# 76. Minimum Window Substring |
| 3 | +
|
| 4 | +solution reference: https://www.algodale.com/problems/minimum-window-substring/ |
| 5 | +
|
| 6 | +## μ£Όμ΄μ§ λ¬Έμμ΄ sμμ λ¬Έμμ΄ tμ λͺ¨λ λ¬Έμλ₯Ό ν¬ν¨νλ μ΅μ μλμ°λ₯Ό μ°Ύμ λ°ννκΈ° π₯ |
| 7 | +
|
| 8 | +> μ¬λΌμ΄λ© μλμ°, μ΅μ μλμ° μ°ΎκΈ°, λ¬Έμμ΄μ λΉλ μΆμ , tμ λͺ¨λ λ¬Έμκ° νμ¬ μλμ°μ ν¬ν¨λμ΄ μλμ§ μΆμ |
| 9 | +
|
| 10 | +- μλμ°μ μ€λ₯Έμͺ½ λμ νμ₯νλ©΄μ, νμν λͺ¨λ λ¬Έμκ° ν¬ν¨λμμ λ, μλμ°μ ν¬κΈ°λ₯Ό μ΅μννκΈ° |
| 11 | +
|
| 12 | +## κ° |
| 13 | +- counts: νμν λ¬Έμκ° λͺ λ² λ±μ₯νλμ§ μΆμ |
| 14 | +- n_included: μλμ° μμμ tμ νμν λ¬Έμ κ°μ μΆμ |
| 15 | +- low, high: μ¬λΌμ΄λ© μλμ°μ μ λ |
| 16 | +- min_low max_high: λ°νκ°, μ¬λΌμ΄λ© μλμ°μ μ λ |
| 17 | +
|
| 18 | +## s νμ |
| 19 | +- sμ μ€λ₯Έμͺ½ λμ νμν©λλ€. |
| 20 | + - νμ¬ λ¬Έμκ° tμ μ‘΄μ¬νλ€λ©΄(countsμ ν€κ° μ‘΄μ¬) |
| 21 | + - κ·Έλ¦¬κ³ νμν λ¬ΈμλΌλ©΄(κ°μ΄ 1 μ΄μ) |
| 22 | + - μλμ° λ΄λΆμ νμ λ¬Έμ κ°μλ₯Ό νλ μ¦κ°μν΅λλ€. |
| 23 | + - ν΄λΉ λ¬Έμμ λ±μ₯ countλ₯Ό νλ κ°μμν΅λλ€. |
| 24 | +
|
| 25 | +## μλμ° μΆμνκΈ° |
| 26 | +- μλ λ¬Ένμ νμν κ°μ΄ μλμ° μμ μ‘΄μ¬νλ λμ λ°λ³΅ν©λλ€. |
| 27 | +1. νμ¬ κ΅¬ν μλμ°κ° λ μμ μ§ νμΈνκ³ , μλ€λ©΄ λ°νν μλμ°λ₯Ό μ
λ°μ΄νΈ ν©λλ€. |
| 28 | +2. sμ μΌμͺ½ λμ νμν©λλ€. |
| 29 | + - νμ¬ λ¬Έμκ° tμ μ‘΄μ¬νλ€λ©΄(countsμ ν€κ° μ‘΄μ¬) |
| 30 | + - ν΄λΉ λ¬Έμμ λ±μ₯ countλ₯Ό νλ μ¦κ°μν΅λλ€. |
| 31 | + - κ·Έλ¦¬κ³ νμν λ¬ΈμλΌλ©΄(κ°μ΄ 1 μ΄μ) |
| 32 | + - μλμ° λ΄λΆμ νμ λ¬Έμ κ°μλ₯Ό νλ μΆμμν΅λλ€.(λ°λ³΅λ¬Έμ 쑰건μ λ²μ΄λ©λλ€.) |
| 33 | +3. λ€μ νμ μ μΌμͺ½ μμΉλ₯Ό νλ μ¦κ°μν΅λλ€. |
| 34 | +
|
| 35 | +## λ°ν |
| 36 | +- μ΅μ μλμ°μ μμκ³Ό λμ lowμ high + 1λ‘ λ°ννλ, μ ν¨ν μλμ°κ° μλλΌλ©΄ ""μ λ°νν©λλ€. |
| 37 | +''' |
| 38 | +class Solution: |
| 39 | + def minWindow(self, s: str, t: str) -> str: |
| 40 | + min_low = 0 |
| 41 | + max_high = len(s) |
| 42 | + counts = Counter(t) |
| 43 | + n_included = 0 |
| 44 | + |
| 45 | + low = 0 |
| 46 | + # s νμ |
| 47 | + for high in range(len(s)): |
| 48 | + char_high = s[high] |
| 49 | + if char_high in counts: |
| 50 | + if counts[char_high] > 0: |
| 51 | + n_included += 1 |
| 52 | + counts[char_high] -= 1 |
| 53 | + |
| 54 | + # μλμ° μΆμνκΈ° |
| 55 | + while n_included == len(t): |
| 56 | + if high - low < max_high - min_low: # 1 |
| 57 | + min_low = low |
| 58 | + max_high = high |
| 59 | + |
| 60 | + char_low = s[low] |
| 61 | + if char_low in counts: # 2 |
| 62 | + counts[char_low] += 1 |
| 63 | + if counts[char_low] > 0: |
| 64 | + n_included -= 1 |
| 65 | + |
| 66 | + low += 1 # 3 |
| 67 | + |
| 68 | + return s[min_low: max_high + 1] if max_high < len(s) else "" |
0 commit comments