중복 문자가 없는 가장 긴 부분 문자열(substring)의 길이를 구해라
ex) abcabcbb
ex) pwwkew 이게핵심
ans = [arr[0]] 첨에 하나 넣어주고
answer = 0
for i in (1~len) 1부터 시작
if arr[i-1] == arr[i]: 앞뒤 같은거면
ans.clear() 기존에 있떤거 다 날려버려
ans.append(arr[i]) 대신 현재는 추가
elif arr[i] in ans: 현재가 기존에 있는 값이야
ans = ans[:i] + arr[i] (중요)배열에 그 값 전까지 다 날려버리고 새로운거랑 ++
else: 완전 새로운거야
ans.append(arr[i]) 그냥 추가
answer = max(answer, len(ans)) max길이를 기록하면 끗
슬라이딩 윈도우로 한 칸씩 우측으로 이동하면서
윈도우 내에 모든 문자가 중복이 없도록 투 포인터로 윈도우 사이즈를 조절하면서 풀이 라는데 뭔소린지 모르겠고
코드보면 이해됨
-> 그려보면 대충 감 옴
진짜 너무 억지 아니냐
class Solution:
def lengthOfLongestSubstring(self, arr: str) -> int:
if arr == "": return 0 # 1번 해결용
elif len(arr) == 1: return 1 # 2번 해결용
arr = list(arr) # 만약을 대비한 공백도 인식
ans = [arr[0]]
answer = 0
for i in range(1,len(arr)):
if arr[i-1] == arr[i]:
ans.clear()
ans.append(arr[i])
elif arr[i] in ans:
ans = ans[ans.index(arr[i])+1:] + list(arr[i])
else:
ans.append(arr[i])
answer = max(answer, len(ans))
return answer
2
['a', 'b']
3
['a', 'b', 'c']
3
['b', 'c', 'a']
3
['c', 'a', 'b']
3
['a', 'b', 'c']
3
['c', 'b']
3
['b']
-------------------------------------------
1
['b']
1
['b']
1
['b']
1
['b']
-------------------------------------------
2
['p', 'w']
2
['w']
2
['w', 'k']
3
['w', 'k', 'e']
3
['k', 'e', 'w']
-------------------------------------------
class Solution:
def lengthOfLongestSubstring(self, arr: str) -> int:
ans = {}
answer = pointer1 = 0
for i, key in enumerate(arr):
# 이미 등장했던 문자라면 'pointer1'위치를 오른쪽으로 이동
if key in ans and pointer1 <= ans[key]:
pointer1 = ans[key] + 1
# 아니면 최대 부분문자열 길이 갱신
else:
answer = max(answer, i-pointer1 + 1)
# 현재 문자 위치를 해시테이블에 추가
ans[key] = i
return answer