(String, Medium) Longest Substring Without Repeating Characters

송재호·2025년 8월 8일
0

https://leetcode.com/problems/longest-substring-without-repeating-characters/description/

중복 없이 가장 긴 서브스트링의 길이를 반환하란다.
배열이든 뭐든 사용해서 슬라이딩 윈도우 구간 내 중복 문자가 있는지 체크하면 된다.

문제에서 s는 영문자, 숫자, 심볼이나 스페이스도 다 포함한댔으므로 그냥 맵으로 한다.
혹시 ASCII 127개 안에 없는걸수도 있으니까..

left, right 포인터를 두고 슬라이딩 윈도우로 구현한다.

중복 문자를 만나면, 이전 중복 문자를 만났던 곳 +1로 left를 옮긴다 (윈도우를 옮겨 중복 제거된 길이를 다시 잼)

다음 현재 캐릭터의 마지막 포지션인 right로 맵을 다시 갱신해주고,
length는 right - left + 1 비교하면서 가장 긴 값을 갱신한다.

주의해야 할 점은 left 갱신 시 다시 빠꾸하지 않게 Math.max로 보장해줄 필요가 있다는 점

class Solution {
    public int lengthOfLongestSubstring(String s) {

        Map<Character, Integer> map = new HashMap<>();
        int left = 0;
        int length = 0;

        for (int right=0; right<s.length(); right++) {
            char c = s.charAt(right);

            if (map.containsKey(c)) {
                left = Math.max(left, map.get(c) + 1);
            }

            map.put(c, right);
            length = Math.max(length, right - left + 1);
        }

        return length;
    }
}
profile
식지 않는 감자

0개의 댓글