Skip to content

Commit 5f684be

Browse files
committed
solve(w07): 3. Longest Substring Without Repeating Characters
1 parent e3ab255 commit 5f684be

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# https://leetcode.com/problems/longest-substring-without-repeating-characters/
2+
3+
class Solution:
4+
def lengthOfLongestSubstring_slow(self, s: str) -> int:
5+
"""
6+
[Complexity]
7+
- TC: O(n)
8+
- SC: O(n)
9+
10+
[Approach]
11+
two pointer๋ฅผ ์ด๋™ํ•ด๊ฐ€๋ฉฐ substring์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์—์„œ, hash table์„ ์ด์šฉํ•˜์—ฌ duplicate character๋ฅผ O(1)์— lookup ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
12+
p1, p2๋ฅผ ๊ฐ๊ฐ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ pointer๋ผ๊ณ  ํ•  ๋•Œ,
13+
- substring์˜ ๋งจ ์˜ค๋ฅธ์ชฝ ๋ฌธ์ž๊ฐ€ duplicate์ด ์•„๋‹ˆ๋ฉด, seen์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋งจ ์˜ค๋ฅธ์ชฝ ๋ฒ”์œ„๋ฅผ ํ•œ ์นธ ๋Š˜๋ฆฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  max_len์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
14+
- substring์˜ ๋งจ ์˜ค๋ฅธ์ชฝ ๋ฌธ์ž๊ฐ€ duplicate์ด๋ฉด, seen์—์„œ ๋งจ ์™ผ์ชฝ ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋งจ ์™ผ์ชฝ ๋ฒ”์œ„๋ฅผ ํ•œ ์นธ ์ค„์ธ๋‹ค.
15+
"""
16+
17+
p1 = p2 = max_len = 0
18+
seen = set()
19+
20+
while p2 < len(s):
21+
# p2๊ฐ€ ์ค‘๋ณต์ด ์•„๋‹Œ ๋ฌธ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉด, seen์— ์ถ”๊ฐ€ํ•˜๊ณ  p2 ํ•œ ์นธ ์˜ฎ๊ธฐ๊ธฐ
22+
if s[p2] not in seen:
23+
seen.add(s[p2])
24+
p2 += 1
25+
# max_len ์—…๋ฐ์ดํŠธ
26+
max_len = max(max_len, p2 - p1)
27+
28+
# p2๊ฐ€ ์ค‘๋ณต์ธ ๋ฌธ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉด, seen์—์„œ s[p1] ์‚ญ์ œํ•˜๊ณ  p1 ํ•œ ์นธ ์˜ฎ๊ธฐ๊ธฐ
29+
else:
30+
seen.remove(s[p1])
31+
p1 += 1
32+
33+
return max_len
34+
35+
def lengthOfLongestSubstring(self, s: str) -> int:
36+
"""
37+
[Complexity]
38+
- TC: O(n)
39+
- SC: O(n)
40+
41+
[Approach]
42+
lengthOfLongestSubstring_slow()์˜ ๊ฒฝ์šฐ, p2๊ฐ€ ์ค‘๋ณต์ธ ๋ฌธ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ p1์„ ํ•œ ์นธ์”ฉ๋งŒ ์ด๋™ํ•œ๋‹ค.
43+
ํ•˜์ง€๋งŒ ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚˜์˜จ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ๋กํ•ด๋‘”๋‹ค๋ฉด, ๋ฐ”๋กœ ๊ทธ ๋‹ค์Œ ์ธ๋ฑ์Šค๋กœ p1์„ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
44+
์ด๋Ÿฌํ•œ ์ธ๋ฑ์Šค๋ฅผ lookup ํ•˜๋Š” ํ–‰์œ„๋„ hash table์„ ์ด์šฉํ•ด O(1)์œผ๋กœ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
45+
"""
46+
47+
p1 = max_len = 0
48+
seen = dict()
49+
50+
for p2, right in enumerate(s):
51+
# right ๋ฌธ์ž๊ฐ€ p1 ~ p2 ๋‚ด ๋ฒ”์œ„์—์„œ ์ด๋ฏธ ๋“ฑ์žฅํ–ˆ๋‹ค๋ฉด, p1์„ right ๋ฌธ์ž๊ฐ€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋“ฑ์žฅํ•œ ์ธ๋ฑ์Šค์˜ ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™
52+
if seen.get(right, -1) >= p1:
53+
p1 = seen[right] + 1
54+
55+
# ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, p1์„ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  max_len ์—…๋ฐ์ดํŠธ
56+
else:
57+
max_len = max(max_len, p2 - p1 + 1)
58+
59+
# right๋ฅผ seen์— ๊ธฐ๋ก
60+
seen[right] = p2
61+
62+
return max_len

0 commit comments

Comments
ย (0)