이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다.
문제 정의
t의 모든 문자, 개수가 포함된 s의 최소 윈도우 출력
책에서 구현된 코드
import collections
class Solution:
def minWindow(self, s: str, t: str) -> str:
need = collections.Counter(t)
missing = len(t)
left = start = end = 0
# 오른쪽 포인터 이동
for right, char in enumerate(s, 1):
missing -= need[char] > 0
need[char] -= 1
# 필요 문자가 0이면 왼쪽 포인터 이동 판단
if missing == 0:
while left < right and need[s[left]] < 0:
need[s[left]] += 1
left += 1
if not end or right - left <= end - start:
start, end = left, right
need[s[left]] += 1
missing += 1
left += 1
return s[start:end]
기억해야할 기법
- Counter가 defaultdict인듯 하다
- 위 코드 need[char]에서 char가 t의 Counter에 포함되지않을 수 있는데 사용
내가 구현한 코드
class Solution:
def minWindow(self, s: str, pattern: str) -> str:
dic_pattern = Counter(pattern)
dic_pattern["total"] = len(set(pattern))
q = deque()
l, r = 0, -1
for i, c in enumerate(s):
if c in dic_pattern:
q.append((i, c))
dic_pattern[c] -= 1
if dic_pattern[c] == 0:
dic_pattern["total"] -= 1
if dic_pattern["total"] == 0:
while dic_pattern[q[0][1]] < 0:
idx, char = q.popleft()
dic_pattern[char] += 1
if r-l < 0 or q[-1][0]-q[0][0] < r-l:
l, r = q[0][0], q[-1][0]
return s[l:r+1]
- 풀긴 풀었는데 지저분한 느낌이다
- deque를 사용해서 그런지 책의 알고리즘이랑 시간차이가 크다
'책읽기' 카테고리의 다른 글
[쉽게 배우는 데이터 통신과 컴퓨터 네트워크](요약)[Chapter-4] 데이터 전송의 기초 (0) | 2021.08.17 |
---|---|
[파이썬 알고리즘 인터뷰][슬라이딩윈도우] 가장 긴 반복 문자 대체 (0) | 2021.08.17 |
[파이썬 알고리즘 인터뷰][슬라이딩윈도우] 최대 슬라이딩 윈도우 (0) | 2021.08.16 |
[파이썬 알고리즘 인터뷰] 20장 - 슬라이딩 윈도우 (0) | 2021.08.16 |
[파이썬 알고리즘 인터뷰][비트연산] 1비트의 개수 (0) | 2021.08.16 |