substring ๊ด๋ จํ ๋ฌธ์ ๋ brute force๋ก ํ๋ฉด (i, j) ๊ตฌ๊ฐ (O(n^2))์ ๋ค์ ๊ฐ ๋ฌธ์ ๋ณ๋ก ์กฐ๊ฑด์ ๊ฒ์ฌํ๋ ๋น์ฉ์ด ๊ณฑํด์ง๊ฒ ๋๋๋ฐ (๋ณดํต input string์ ๊ธ์ ์์ ๋น๋ก), ์ฌ๊ธฐ์ ๋น ๋ฅด๊ฒ ๋๋ฆฌ๊ณ ์ถ์ ๋๋ ์คํ๋๋ (i, j)์ ๊ฐ์๋ฅผ ์ค์ด๋ ์ ๋ฐ์ ์๋ค. substring์ ์ฐพ๋ ๋ฌธ์ ์์ ๋ถ๋ถ ์ผ์น ํ ์ด๋ธ์ ๋ง๋ค์ด๋์ผ๋ฉด ๊ธฐ์กด์ ์ฐพ์๋์ substring ์ ๋ณด๋ฅผ ํ์ฉํ ์ ์๋ฏ์ด ์ด ๋ฌธ์ ์์๋ ์์์ ์ฐ๋ ์ ๋ณด๋ฅผ ๊ทธ๋๋ก ํ์ฉํ ์ ์๋ค.
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
longest = 0
d = {}
start = 0
for end in range(0, len(s)):
c = s[end]
if d.get(c) is None or d.get(c) < start:
d[c] = end
longest = max(longest, end-start +1)
else: # d.get(c) >= start
start = d.get(c) + 1
d[c] = end
return longest
๋ฃจํ๊ฐ ๋๋ ๋ด๋ด ์ง์ผ์ ธ์ผ ํ๋ ๊ฒ์ ๊ตฌ๊ฐ [start, end] ์ฌ์ด์ repeating character๊ฐ ํ๋๋ ์กด์ฌํ๋ฉด ์๋๋ค๋ ๊ฒ์ด๋ค. ์๋ก ๋ง๋ character๊ฐ ๋ํธ์ ์๊ฑฐ๋, start ์ด์ ์ ๋ํ๋ฌ์์ผ๋ฉด [start, end] ๊ตฌ๊ฐ์ด ๊ธธ์ด์ง๋ ๊ฒ์ด๊ณ start, end ์ฌ์ด์ ์์์ผ๋ฉด start๋ฅผ ๋ค๋ก ๋ฏธ๋ค์ ์ ๊ตฌ๊ฐ์ ๋ง๋ ๋ค.