728x90
문제
Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:
Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
문자열이 주어졌을 때 반복되는 문자 없이 가장 긴 substring의 길이를 찾아라!
처음에 문제를 잘못 이해하여 문자가 아닌 substring이 반복되지 않는 코드를 짜다가 시간을 허비했다..
중복되지 않는 값을 확인해야 한다고 생각했을 때
O(1) 로 빠르고 값도 중복되지 않으니
Set 을 써야할 것 같았다.
import java.util.*;
class Solution {
public int lengthOfLongestSubstring(String s) {
int answer = 0;
int j = 0;
Set<Character> set = new HashSet<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
while(set.contains(c)) {
set.remove(s.charAt(j));
j++;
}
set.add(c);
answer = Math.max(set.size(), answer);
}
return answer;
}
}
[문제분석]
- string을 리턴하는게 아니라 길이를 리턴한다.
: func subString(String s) -> int - a-z 까지 26개의 알파벳 : 답이 제일 긴게 26 이다.
- Brutal force solution
func hasDup(String s){
Set<char> set = new Set<>();
for(char c : s){
if set.contains s:
return false;
else
add to set
} - Time: O(n^3), Space: O(n)
- Sliding window 전략: i, j pointer set
a b c a b c b
i = a
j = a
sub="a"
set={a}
i = a
j = b
sub="ab"
set{a,b}
i = a
j = c
sub="abc"
set{a,b,c}
-----------------
a로 겹쳤을 경우 i 를 increment 해서 조건이 성립되게 바꾼다.
i = a -> b
j = a
sub = "bca"
set{b,c,a}
i = b -> c
j = b
sub = "cab"
set{cab}
--> O(n^2)
[참고영상]
728x90
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode - 994. Rotting Oranges (0) | 2020.06.01 |
---|---|
LeetCode - 15. 3Sum (0) | 2020.06.01 |
LeetCode - 53. Maximum Subarray (0) | 2020.05.28 |
LeetCode - 5. Longest Palindromic Substring (0) | 2020.05.27 |
LeetCode - 146. LRU Cache (4) | 2020.05.26 |
댓글