Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 |
Tags
- db
- 배포
- 애플
- 리액트
- string
- c++
- 기억장치
- binary
- react
- 식물키우기
- styled-components
- java
- 반응형 웹
- git
- 맛집
- Javascript
- 정규표현식
- ECMAScript6
- 자바스크립트
- 데이터베이스
- ECMAScript2015
- 운영체제
- 자바
- Algorithm
- LeetCode
- codewars
- 아이폰
- 알고리즘
- 컴퓨터
- ES6
Archives
- Today
- Total
에브리 저장소
[Leetcode - String] Longest substring without repeating characters 풀이 본문
자료구조 · 알고리즘
[Leetcode - String] Longest substring without repeating characters 풀이
eblee 2019. 11. 10. 14:02
문제 링크
https://leetcode.com/problems/longest-substring-without-repeating-characters/
풀이
이 문제는 문자열에서 중복 없이 가장 긴 substring의 길이를 반환하는 문제이다. 내가 접근한 방식은 완전 탐색이다.
자신보다 뒤에 있는 문자열들을 순회하면서 중복이 발생하기 전까지의 길이를 찾아 저장해놓은 max length와 비교하는 로직을 작성했다.
O(N^2)의 시간 복잡도를 가지기 때문에 상대적으로 너무 느리다.
다른 사람들의 풀이를 보았고, O(N)으로 푸는 코드를 찾았다.
이 코드는 각 문자열을 map이라는 객체에 저장하면서 value로 이 문자가 가장 마지막으로 나온 index를 저장한다. 이로 인해 한번 순회로 중복 없는 최대 길이를 구할 수 있다.
정답 코드
var lengthOfLongestSubstring = function (s) {
let maxLen = 0;
let tempLen = 0;
let arr = [...s];
let arrLen = arr.length;
let obj = {};
for(let i=0; i<arrLen; i++) {
obj = {};
tempLen = 0;
for(let j=i; j<arrLen; j++) {
if(obj[arr[j]]) break;
else {
tempLen += 1;
obj[arr[j]] = true;
}
}
maxLen = Math.max(maxLen, tempLen);
}
return maxLen;
};
O(N) code
function lengthOfLongestSubstringBest(s) {
const map = {};
var left = 0;
return s.split('').reduce((max, v, i) => {
left = map[v] >= left ? map[v] + 1 : left;
map[v] = i;
return Math.max(max, i - left + 1);
}, 0);
}
'자료구조 · 알고리즘' 카테고리의 다른 글
[Codewars - 7 kyu] Regex validate PIN code (0) | 2020.01.16 |
---|---|
[Codewars - 7 kyu] Mumbling (0) | 2020.01.15 |
[Leetcode - Binary] Sum of two integers 풀이 (0) | 2019.11.09 |
[C++] char형 데이터 int형으로 변환하기 (0) | 2019.04.30 |
[C++] vector 순회하는 방법 (0) | 2019.04.29 |
Comments