Skip to content

Commit 7a9c45a

Browse files
committedFeb 8, 2025·
add solution: minimum-window-substring
1 parent 52cb217 commit 7a9c45a

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed
 

‎minimum-window-substring/dusunax.py

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
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

Comments
 (0)
Please sign in to comment.