문제 정리
→ 중복 문자가 없는 가장 긴 부분 문자열의 길이를 리턴.
→ 중요한 건 가장 긴 부분 문자열이라는 것이다.
→ 예를들어 입력값이 “pwwkew” → wke가 정답이다 ( 부분문자열 )
접근 방법
→ 처음에는 큐를 이용하는 방식으로 접근했으나 부분 문자열을 출력하는 부분에서 막혔다.
→ 대게 이런 문제는 투포인터를 사용하는 것은 알고 있으나 한참 지나도 구현해내지 못해서 해설을 보았다.
해설 풀이
투포인터를 생성하고 슬라이딩 윈도우 방식으로 오른쪽으로 이동해나가면서 찾는 방법이다.
→ used는 해시테이블 역할을 하고 첫번째 포인터와 두번째 포인터는 각각 0에서부터 시작하도록 한다.
used = {}
max_length = start = 0
→ 등장했던 문자라면 시작지점을 used[char] + 1 위치로 이동시킨다.
for index, char in enumerate(s):
# 이미 등장했던 문자라면 'start' 위치 갱신
if char in used and start <= used[char]:
start = used[char] + 1
→ 처음보는 문자라면 두번째 포인터를 바꿔주는데 현재까지 최대 길이와 비교해주어 더 큰값을 가지고 있도록 한다.
else:
max_length = max(max_length, index - start + 1)
→ 현재 문자의 위치를 계속 수정해주어준다.
# 현재 문자의 위치 삽입
used[char] = index