Longest Substring Without Repeating Characters
LeetCode 3. Longest Substring Without Repeating Characters
원문
Given a string s
, find the length of the longest substring without repeating characters.
풀이
Minimum Size Subarray Sum 문제를 참고했다.
- 문자를 저장하기 위한 큐
letters
와 세트chk
, 길이를 저장하기 위한 변수result
를 선언한다. s
를 순회한다.s[i]
가chk
에 없는 경우letters
의 뒤에s[i]
를 추가한다.chk
에s[i]
를 추가한다.
s[i]
가chk
에 있는 경우letters
의 가장 앞 원소가s[i]
가 될 때까지letters
의 앞에서 문자를 제거하고 그 문자를chk
에서도 제거한다.letters
의 가장 앞 원소가s[i]
가 되었다면letters
의 앞에서 그 문자를 제거하고letters
의 뒤에 추가한다.
result
의 값을result
와letters
의 길이 중 긴 것으로 갱신한다.
result
를 반환한다.
코드
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from collections import deque
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
letters, chk = deque(), set()
result = 0
for i in range(len(s)):
if s[i] not in chk:
letters.append(s[i])
chk.add(s[i])
else:
while letters[0] != s[i]:
chk.remove(letters.popleft())
letters.popleft()
letters.append(s[i])
result = max(result, len(letters))
return result
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public int lengthOfLongestSubstring(String s) {
Deque<Character> que = new ArrayDeque<>();
Set<Character> letters = new HashSet<>();
int result = 0;
int idx = 0;
while (idx < s.length()) {
if (letters.contains(s.charAt(idx))) {
while (que.peekFirst() != s.charAt(idx)) {
letters.remove(que.pollFirst());
}
que.pollFirst();
que.add(s.charAt(idx));
idx++;
} else {
que.add(s.charAt(idx));
letters.add(s.charAt(idx));
idx++;
}
result = Math.max(result, que.size());
}
return result;
}
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.