Topics
- Hash Table
- String
- Sliding Window
문제 포인트
- 연결 리스트의 현재, 다음 포인터 연결
- 반복문에서 다음 포인터 연결 로직
count[i]랑 현재 탐색 노드(board[r][c])가 일치하지 않을 때 탐색 중단
- 방문 업데이트 시점의 중요성 (경로 탐색의 경우, 인접 노드 모두 방문한 이후)
정답
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
let set = new Set();
let start = 0;
let longest = 0;
for (let end = 0; end < s.length; end++) {
let char = s[end];
// 중복 문자가 존재하면 앞에서 제거하면서 윈도우 이동
/**@note 이 부분에서 s[start]로 start를 움직이고, set에서 제거함
* @note Sliding Window의 가변 크기가 구현됨
* **/
while (set.has(char)) {
set.delete(s[start]);
start++;
}
set.add(char); // 새로운 문자 추가
/** @note 업데이트 시점은 set의 변경 이후에 실행함 **/
longest = Math.max(longest, end - start + 1); // 길이 갱신
}
return longest;
};
오답 사고 과정
접근 문제점
- 새로운 연결 리스트 생성 오류
returnList를 리스트로 변환하려 했으나 next 추가 방식이 틀림. 올바른 방식은 새로운 ListNode를 생성하고 current.next로 연결해야 함. 반복문에서 next 추가 방법 문제
returnList(start, next)는 올바르지 않음. dummyHead 노드를 두고 current 포인터를 활용하여 next로 연결해야 함.
- 리스트 숫자 변환 오류 (getAllNum 함수)
while (li?.val) → while (li !== null)
nums.unshift(li.val) 대신 nums.push(li.val)
join("") * 1 대신 Number(join("")) 또는 BigInt(join("")) 사용해야 큰 숫자 처리 가능.
var lengthOfLongestSubstring = function (s) {
let set = new Set();
let start = 0;
let longest = -1;
for (let end = 0; end < s.length; end++) {
let char = s[end];
if (!set.has(char)) {
set.add(char);
} else {
longest = Math.max(longest, end - start + 1);
start++;
// set 초기화? 업데이트? 어떻게 해야하지.
}
}
return longest;
};