[Leetcode] 3. Longest Substring Without Repeating Characters

2025. 8. 22. 18:25·알고리즘/Java
반응형

✨ 문제 URL

LeetCode 3. Longest Substring Without Repeating Characters


✨ 문제 설명

주어진 문자열 s에서 중복 문자가 없는 가장 긴 부분 문자열(substring)의 길이를 구하는 문제입니다.

  • Substring: 문자열 내에서 연속된 문자들의 집합
    • Subsequence(부분 수열)과는 달리 연속성이 보장되어야 합니다.

📌 예시

  • s = "abcabcbb" → 정답: 3 ("abc")
  • s = "bbbbb" → 정답: 1 ("b")
  • s = "pwwkew" → 정답: 3 ("wke")

💡 접근 방법: Sliding Window + HashMap

이 문제는 슬라이딩 윈도우(Sliding Window)와 해시맵(HashMap)을 활용해 효율적으로 풀 수 있습니다.

  1. 윈도우(window) 관리
    • left와 right 두 포인터를 사용해 현재 윈도우를 표현합니다.
    • right는 문자열을 순회하며 새 문자를 탐색합니다.
    • 중복이 발생하면 left를 이동시켜 윈도우 범위를 조정합니다.
  2. HashMap 활용
    • 각 문자가 마지막으로 등장한 인덱스를 저장합니다.
    • 중복 문자가 나오면, 해당 문자의 마지막 인덱스 + 1을 left로 갱신합니다.
  3. 최대 길이 추적
    • 매번 (right - left + 1) 값을 계산하여 지금까지의 최대 길이와 비교합니다.

🖼️ 슬라이딩 윈도우 동작 시각화

s = "abcabcbb" 를 예시로 살펴보겠습니다.

Step  Right Index  Current Char  Left Index 이동  Window 문자열  maxLength
1 0 'a' - "a" 1
2 1 'b' - "ab" 2
3 2 'c' - "abc" 3
4 3 'a' 0 → 1 "bca" 3
5 4 'b' 1 → 2 "cab" 3
6 5 'c' 2 → 3 "abc" 3
7 6 'b' 3 → 5 "cb" 3
8 7 'b' 5 → 7 "b" 3

👉 최대 길이는 3


✅ 코드 풀이

import java.util.HashMap;

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 문자의 마지막 인덱스를 저장하는 해시맵
        HashMap<Character, Integer> charIndexMap = new HashMap<>();

        int maxLength = 0;
        int left = 0; // 윈도우의 왼쪽 포인터

        // 오른쪽 포인터로 문자열 탐색
        for (int right = 0; right < s.length(); right++) {
            char currentChar = s.charAt(right);

            // 중복 문자가 발견된 경우
            if (charIndexMap.containsKey(currentChar) && charIndexMap.get(currentChar) >= left) {
                left = charIndexMap.get(currentChar) + 1;
            }

            // 현재 문자의 인덱스를 갱신
            charIndexMap.put(currentChar, right);

            // 최대 길이 갱신
            maxLength = Math.max(maxLength, right - left + 1);
        }

        return maxLength;
    }
}
  • 시간 복잡도: O(n) (문자열을 한 번만 순회)
반응형

'알고리즘 > Java' 카테고리의 다른 글

[프로그래머스] 프로세스 - 42587 (Java)  (2) 2025.07.28
[프로그래머스] 베스트앨범 - 42579 (Java)  (0) 2025.01.20
[프로그래머스] 오픈채팅방 - 42888(Java)  (0) 2025.01.16
[프로그래머스] 할인 행사 - 131127(Java)  (0) 2025.01.09
[프로그래머스] 완주하지 못한 선수 - 42576(Java)  (0) 2025.01.07
'알고리즘/Java' 카테고리의 다른 글
  • [프로그래머스] 프로세스 - 42587 (Java)
  • [프로그래머스] 베스트앨범 - 42579 (Java)
  • [프로그래머스] 오픈채팅방 - 42888(Java)
  • [프로그래머스] 할인 행사 - 131127(Java)
Kim-SooHyeon
Kim-SooHyeon
개발일기 및 알고리즘, 블로그 운영에 대한 글을 포스팅합니다. :) 목표: 뿌리 깊은 개발자 되기
    반응형
  • Kim-SooHyeon
    soo_vely의 개발로그
    Kim-SooHyeon
  • 전체
    오늘
    어제
    • 분류 전체보기 (253)
      • 알고리즘 (108)
        • 자료구조 (3)
        • Java (104)
        • Python (1)
      • Back end (70)
        • Spring Project (27)
        • Java (21)
        • API (1)
        • Python (0)
        • Django (3)
        • Linux (1)
        • 서버 (2)
        • 에러로그 (11)
        • 부스트 코스 (1)
      • Front end (9)
        • HTML, CSS (4)
        • JavaScript (4)
        • JQuery (0)
      • 기타 프로그래밍 (4)
        • Android Studio (1)
        • Arduino (2)
        • Azure Fundamental(AZ-900) (1)
      • 개발도구 (23)
        • Git (12)
        • SVN (0)
        • Eclipse (2)
        • 기타 Tool (9)
      • Database (16)
        • Oracle (10)
        • MySQL (0)
        • H2 Database (3)
        • ORM & JPA (1)
      • 자격증 (10)
        • 컴활 1급 (7)
        • 컴활 2급 (2)
        • SQLD (1)
      • 기타 (13)
        • 블로그 운영 (6)
        • 문서 (1)
        • 기타 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    springboot
    알고리즘
    java
    백준 자바
    spring
    for문
    github
    Oracle
    jpa
    오라클
    배열
    1차원 배열
    단계별풀기
    백준알고리즘
    백준
    BOJ
    Git
    구현
    solved.ac
    문자열
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kim-SooHyeon
[Leetcode] 3. Longest Substring Without Repeating Characters
상단으로

티스토리툴바