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