import collections
class Solution:
def minWindow(self, s: str, t: str) -> str:
t_dict = collections.defaultdict(int)
min_need_alpha = len(t)
for alpha in t:
t_dict[alpha] += 1
## 1)
left = -1
right = -1
for i in range(len(s)):
if left == -1 and s[i] in t_dict:
left = i
t_dict[s[i]] -= 1
min_need_alpha -= 1
elif s[i] in t_dict:
t_dict[s[i]] -= 1
if t_dict[s[i]] >= 0:
min_need_alpha -= 1
if not min_need_alpha:
right = i
break
if min_need_alpha > 0: return ''
if right == -1: return t
###
### 2)
while True:
if s[left] in t_dict:
if t_dict[s[left]] == 0:
break
t_dict[s[left]] += 1
left += 1
###
min_length = right - left + 1
ans = s[left:right+1]
### 3)
while True:
right += 1
while right < len(s) and s[left] != s[right]:
if s[right] in t_dict:
t_dict[s[right]] -= 1
right += 1
if right == len(s):
break
t_dict[s[left]] -= 1
while True:
if s[left] in t_dict:
if t_dict[s[left]] == 0:
break
t_dict[s[left]] += 1
left += 1
if right - left + 1 < min_length:
ans = s[left: right+1]
min_length = right-left + 1
###
return ans
개략적으로 얘기하면 배열에서 가장 처음 만족하는 배열의 시작 index
와 끝index
를 찾습니다.
그리고 while을 통해 또 다른 배열의 조합이 있을때까지 찾습니다.
찾는 방법은
left
위치의 문자와 right
위치의 문자가 같을때 까지 right
를 늘립니다.left
의 크기를 키웁니다.substring
을 비교하여 정답을 정합니다.1번 과정을 통해서
s
가 한 글자이고 t
도 똑같이 한 글자인지 확인2번 과정을 통해
left
를 더 오른쪽으로 당길 수 있는지 확인3번 과정을 통해
substring
찾기## 리팩토링 해보자
import collections
class Solution:
def minWindow(self, s: str, t: str) -> str:
t_dict = collections.defaultdict(int)
min_need_alpha = len(t)
for alpha in t:
t_dict[alpha] += 1
L, R = 0, -1
left = 0
for right in range(len(s)):
if s[right] in t_dict:
min_need_alpha -= t_dict[s[right]] > 0
t_dict[s[right]] -= 1
if min_need_alpha == 0:
while s[left] not in t_dict or t_dict[s[left]] < 0:
if s[left] in t_dict:
t_dict[s[left]] += 1
left += 1
if R == -1 or right - left < R - L:
R = right
L = left
if min_need_alpha > 0: return ''
return s[L:R+1]
과정을 여러번 반복하기 않고