|
| 1 | +""" |
| 2 | +๐ 3. Longest Substring Without Repeating Characters |
| 3 | +
|
| 4 | +๐ ๋ฌธ์ ์์ฝ |
| 5 | +- ์ฃผ์ด์ง ๋ฌธ์์ด s์์ ์ค๋ณต ๋ฌธ์๊ฐ ์๋ ๊ฐ์ฅ ๊ธด ๋ถ๋ถ ๋ฌธ์์ด์ ๊ธธ์ด ์ฐพ๊ธฐ |
| 6 | +- ์: "abcabcbb" โ "abc" โ 3 |
| 7 | +
|
| 8 | +๐ฏ ํต์ฌ ์๊ณ ๋ฆฌ์ฆ |
| 9 | +- ํจํด: ์ฌ๋ผ์ด๋ฉ ์๋์ฐ (Sliding Window) + ํด์๋งต |
| 10 | +- ์๊ฐ๋ณต์ก๋: O(n) |
| 11 | +- ๊ณต๊ฐ๋ณต์ก๋: O(min(n, m)) - m์ ๋ฌธ์ ์งํฉ ํฌ๊ธฐ |
| 12 | +
|
| 13 | +๐ก ํต์ฌ ์์ด๋์ด |
| 14 | +1. left, right ๋ ํฌ์ธํฐ๋ก ์๋์ฐ ๊ด๋ฆฌ |
| 15 | +2. ํด์๋งต์ ๊ฐ ๋ฌธ์์ ๋ง์ง๋ง ์์น ์ ์ฅ |
| 16 | +3. ์ค๋ณต ๋ฐ๊ฒฌ ์ โ left๋ฅผ ์ค๋ณต ๋ฌธ์ ๋ค์์ผ๋ก ์ ํ! |
| 17 | +4. ๋งค ๋จ๊ณ๋ง๋ค ์๋์ฐ ํฌ๊ธฐ(right - left + 1) ์ต๋๊ฐ ๊ฐฑ์ |
| 18 | +""" |
| 19 | + |
| 20 | + |
| 21 | +class Solution: |
| 22 | + def lengthOfLongestSubstring(self, s: str) -> int: |
| 23 | + char_index = {} # ๋ฌธ์ โ ๋ง์ง๋ง ์ธ๋ฑ์ค |
| 24 | + left = 0 |
| 25 | + max_len = 0 |
| 26 | + |
| 27 | + for right, char in enumerate(s): |
| 28 | + # ์ค๋ณต ๋ฌธ์๊ฐ ํ์ฌ ์๋์ฐ ์์ ์์ผ๋ฉด |
| 29 | + if char in char_index and char_index[char] >= left: |
| 30 | + left = char_index[char] + 1 # ์ค๋ณต ๋ค์์ผ๋ก ์ ํ |
| 31 | + |
| 32 | + char_index[char] = right # ํ์ฌ ์์น ๊ฐฑ์ |
| 33 | + max_len = max(max_len, right - left + 1) |
| 34 | + |
| 35 | + return max_len |
| 36 | + |
| 37 | + |
| 38 | +# Set์ ์ฌ์ฉํ ๋ฐฉ์ (๋ ์ง๊ด์ ) |
| 39 | +class SolutionWithSet: |
| 40 | + def lengthOfLongestSubstring(self, s: str) -> int: |
| 41 | + char_set = set() |
| 42 | + left = 0 |
| 43 | + max_len = 0 |
| 44 | + |
| 45 | + for right in range(len(s)): |
| 46 | + # ์ค๋ณต์ด ์ฌ๋ผ์ง ๋๊น์ง left ์ด๋ |
| 47 | + while s[right] in char_set: |
| 48 | + char_set.remove(s[left]) |
| 49 | + left += 1 |
| 50 | + |
| 51 | + char_set.add(s[right]) |
| 52 | + max_len = max(max_len, right - left + 1) |
| 53 | + |
| 54 | + return max_len |
| 55 | + |
0 commit comments