diff --git a/_posts/2024-02-18-leetcode-3.md b/_posts/2024-02-18-leetcode-3.md index fbc57d1..e3d37bb 100644 --- a/_posts/2024-02-18-leetcode-3.md +++ b/_posts/2024-02-18-leetcode-3.md @@ -2,7 +2,22 @@ layout: post title: (Leetcode) 3 - Longest Substring Without Repeating Characters categories: [스터디-알고리즘] -tags: [파이썬, 알고리즘, python, algorithm, Leetcode, string, char, character] +tags: + [ + 파이썬, + 알고리즘, + python, + algorithm, + Leetcode, + string, + char, + character, + 자바, + java, + set, + hashset, + queue, + ] date: 2024-02-18 12:00:00 +0900 --- @@ -69,3 +84,81 @@ class Solution: 똑똑하게 접근한 것 같다. temp를 통해 최대로 긴 문자열을 저장해두고, 동일한 글자가 나오면 앞에서 해당 글자를 제거하고 뒤에 해당 글자를 추가하는 방식을 택하였다. + +## Java로 다시 풀어보기 (queue를 사용해서 풀기) (240603) + +위 글을 보지 않고 자바로 다시 풀어봤다. + +```java +public int lengthOfLongestSubstring(String s) { + if (s.isEmpty()) { + return 0; + } + + Queue queue = new LinkedList<>(); + int start = 0; + int end = 0; + int longest = 0; + + while (pointer < s.length()) { + char _char = s.charAt(pointer); + while (queue.contains(_char)) { + queue.remove(); + } + queue.add(_char); + longest = Math.max(longest, queue.size()); + pointer++; + } + + return longest; +} +``` + +### TC, SC + +시간 복잡도는 O(n^2) 이고, 공간 복잡도는 O(n) 이다. + +![retry result](/assets/images/2024-02-18-leetcode-3/retry-result.png) + +아무래도 시간을 더 줄여줘야 할 것 같다. + +## 좀 더 최적화 해보기 + +contains 에서 시간을 많이 뺏는것 같다는 생각이 들었다. (순회 탐색 하려면 O(n) 이니깐) + +중복이 되면 안된다는 점에서 Set을 사용했다. + +```java +class Solution { + public int lengthOfLongestSubstring(String s) { + if (s.isEmpty()) { + return 0; + } + + Set set = new HashSet<>(); + int pointer = 0; + int longest = 0; + + while (pointer < s.length()) { + char _char = s.charAt(pointer); + while (set.contains(_char)) { + set.remove(s.charAt(pointer - set.size())); + } + set.add(_char); + longest = Math.max(longest, set.size()); + pointer++; + } + + return longest; + } +} +``` + +## TC, SC + +시간 복잡도는 O(n) 이고, 공간 복잡도는 O(n) 이다. +내부 while이 그대로 있지만 O(n)으로 적은 이유는 hash set의 경우 search 하는데 드는 비용이 O(1) 이기 때문이다. + +![final result](/assets/images/2024-02-18-leetcode-3/final-result.png) + +결과적으로 시간이 많이 줄어들었다. diff --git a/assets/images/2024-02-18-leetcode-3/final-result.png b/assets/images/2024-02-18-leetcode-3/final-result.png new file mode 100644 index 0000000..c05c235 Binary files /dev/null and b/assets/images/2024-02-18-leetcode-3/final-result.png differ diff --git a/assets/images/2024-02-18-leetcode-3/retry-result.png b/assets/images/2024-02-18-leetcode-3/retry-result.png new file mode 100644 index 0000000..1ee9c6b Binary files /dev/null and b/assets/images/2024-02-18-leetcode-3/retry-result.png differ