-
[Algorithm] LeetCode - 3. Longest Substring Without Repeating Characters (Hash Table, String, Sliding Window)Alogorithm 2022. 7. 28. 00:14반응형
LeetCode 문제입니다.
[문제설명]
Given a string s, find the length of the longest substring without repeating characters.
번역)
Given a string s, find the length of the longest substring without repeating characters. 주어는 문자열 s에서, 반복되지 않은 문자가 없는 가장 긴 문자열의 길이를 구하시오
Topic: Hash Table, String, Sliding Window
Level: Medium
Accepted 3,608,442 / Submissions 10,756,223
[제한사항]
- 0 <= s.length <= 5 * 104
- s consists of English letters, digits, symbols and spaces.
[입출력]
예시 1
Input: s = "abcabcbb" Output: 3 Explanation: The answer is "abc", with the length of 3.
예시 2
Input: s = "bbbbb" Output: 1 Explanation: The answer is "b", with the length of 1.
예시 3
Input: s = "pwwkew" Output: 3 Explanation: The answer is "wke", with the length of 3. Notice that the answer must be a substring, "pwke" is a subsequence and not a substring.
[문제풀이]
/** * @param {string} s * @return {number} */ const lengthOfLongestSubstring = (s) => { // helpers const checkSubstring = (subStr) => subStr === [...new Set(subStr.split(""))].join("") if (s === "") return 0 let result = 1 while (true) { let tmp = result for (let i = 0; i < s.length - result; i++) { let subString = s.substr(i, result + 1) if (checkSubstring(subString)) { result++; break; } else { continue; } } if (tmp === result) break } return result };
첫번째 Code :
시간 복잡도가...꽝이다.
시간 내에 풀기 위해서 이런 혼종의 코드가 나왔는데 아래의 코드로 sliding winodw와 Hash table 방식이 맞는 것 같음.
Idea:
1. result(length)를 초기화하여 시작해서 답이 나올때까지 구하는 로직
2. checkSubstring helper에서 subStr이 반복되는 문자가 있는지 확인
3. subString이 로직을 만족하는 경우 result 값을 올리고 result+1인 경우도 가능한지 찾기 위해 break
const lengthOfLongestSubstring = s => { // keeps track of the most recent index of each letter. const map = {}; // keeps track of the starting index of the current substring. var left = 0; return s.split('').reduce((max, v, i) => { // starting index of substring is 1 + (the last index of this letter) to ensure this letter is not counted twice. left = map[v] >= left ? map[v] + 1 : left; // updates last recorded index of letter to the most recent index. map[v] = i; // indices of current substring is (idx - leftIdx, idx). // +1 because if your substring starts and ends at index 0, it still has a length of 1. return Math.max(max, i - left + 1); }, 0) };
첫번째 Code :
Map과 start pointer을 사용해서 시간 복잡도를 O(n)으로 내릴 수 있음
[Performance]
최근 performance가 두번째 코드
반응형'Alogorithm' 카테고리의 다른 글