File tree Expand file tree Collapse file tree 2 files changed +104
-0
lines changed
longest-substring-without-repeating-characters Expand file tree Collapse file tree 2 files changed +104
-0
lines changed Original file line number Diff line number Diff line change 1+ """
2+ 문자열 s가 주어졌을 때, 중복된 문자를 제거하고 가장 긴 연속된 substring을 찾아라
3+
4+ 1. 첫번째 풀이
5+
6+ Hint!
7+ Generate all possible substrings & check for each substring if it's valid and keep updating maxLen accordingly.
8+
9+ TC: O(N^3)
10+ SC: O(N)
11+ => Time Limit Exceeded
12+
13+ 2. 최적화 - 슬라이딩 윈도우 + 해시셋
14+ - 슬라이딩 윈도우: 문자열 내에서 left, right 포인터로 범위를 정하고 점진적으로 이동
15+ - 해시셋: 현재 윈도우에 어떤 문자가 있는지 빠르게 체크 가능
16+ - 중복 문자가 등장하면 왼쪽 포인터를 이동시켜서 중복을 제거
17+
18+ TC: O(N)
19+ SC: O(N)
20+ """
21+
22+ # Time Limit Exceeded 풀이
23+ class Solution :
24+ def lengthOfLongestSubstring (self , s : str ) -> int :
25+ max_len = 0
26+
27+ # Generate all possible substrings without duplicate characters
28+ def make_all_substrings (string ):
29+ nonlocal max_len
30+ n = len (string )
31+ for i in range (n ):
32+ for j in range (i + 1 , n + 1 ):
33+ k = len (string [i :j ])
34+ if k == len (list (set (string [i :j ]))): # if it's valid
35+ max_len = max (k , max_len ) # keep updating maxLen accordingly
36+
37+ make_all_substrings (s )
38+ return max_len
39+
40+
41+ # 최적화 - 슬라이딩 윈도우 + 해시셋 풀이
42+ class Solution :
43+ def lengthOfLongestSubstring (self , s : str ) -> int :
44+ char_set = set () # 현재 윈도우에 있는 문자들
45+ left = 0
46+ max_len = 0
47+
48+ for right in range (len (s )):
49+ # 중복 문자가 나오면 왼쪽 포인터를 이동시켜 중복 제거
50+ while s [right ] in char_set :
51+ char_set .remove (s [left ])
52+ left += 1
53+
54+ # 중복이 없으면 윈도우에 추가
55+ char_set .add (s [right ])
56+
57+ # 최대 길이 갱신
58+ max_len = max (max_len , right - left + 1 )
59+
60+ return max_len
Original file line number Diff line number Diff line change 1+ # Definition for singly-linked list.
2+ # class ListNode:
3+ # def __init__(self, val=0, next=None):
4+ # self.val = val
5+ # self.next = next
6+
7+ """
8+ 1. Stack 활용 (LIFO)
9+ - LinkedList의 모든 원소를 Stack에 넣고 꺼냄
10+ TC: O(n) time
11+ SC: O(n) space
12+
13+ 2. 최적화 풀이
14+ - 현재 LinkedList를 거꾸로 뒤짚기
15+ TC: O(n) -> LinkedList를 딱 한 번 순회
16+ SC: O(1) -> 변수를 포인터 2개만 사용
17+ """
18+
19+ # Stack 풀이
20+ class Solution :
21+ def reverseList (self , head : Optional [ListNode ]) -> Optional [ListNode ]:
22+ stack = []
23+ node = head
24+ while node :
25+ stack .append (node )
26+ node = node .next
27+
28+ dummy = ListNode (- 1 )
29+ node = dummy
30+ while stack :
31+ node .next = stack .pop ()
32+ node = node .next
33+ node .next = None
34+ return dummy .next
35+
36+ # 최적화
37+ class Solution :
38+ def reverseList (self , head : Optional [ListNode ]) -> Optional [ListNode ]:
39+ prev , curr = None , head
40+ while curr :
41+ temp_next = curr .next
42+ curr .next = prev
43+ prev , curr = curr , temp_next
44+ return prev
You can’t perform that action at this time.
0 commit comments