m1ndy5's coding blog

LeetCode 3. Longest Substring Without Repeating Characters with Python 본문

알고리즘 with python/알고리즘 스터디

LeetCode 3. Longest Substring Without Repeating Characters with Python

정민됴 2024. 1. 4. 20:03

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

내가 푼 코드

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        answer = 0
        # 중복 알바벳 체크
        alpha = set()
        # 길이가 1이면 그냥 1 리턴
        if len(s) == 1:
            return 1

        for i in range(len(s) - 1):
            alpha = set()
            # 차례대로 비교해서 중복 있으면 포문 나오기
            for j in range(i, len(s)):
                if s[j] not in alpha:
                    alpha.add(s[j])
                else:
                    break
            # 현재 최대값이랑 비교해서 더 큰걸로 바꾸기
            answer = max(len(alpha), answer)
        return answer

통과되긴 했지만 사실 포문을 돌면서 계속 set을 초기화하는 것과 이중포문을 쓰는 것이 별로 맘에 들진 않았던 코드였다.

책코드

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        used = {}
                max_length = start = 0
                for i, v in enumerate(s):
                    # 이미 등장했던 문자라면 start 위치 갱신
                    if v in used and start <= used[v]:
                        start = used[v] + 1
                    else:
                        max_length = max(max_length, i-start+1)
                    # 현재 문자의 위치 삽입
                    used[v] = i

                return max_length

인덱스와 값을 사용해서 이미 등장했던 문자라면 start를 다음 위치로 옮겨주고 계속해서 max길이를 갱신하는 방법이다.
set을 계속 재정의할 필요도 없고 포문도 한번만 돌면되서 훨씬 효율적인 코드였다.
다음부터 인덱스와 값을 적절히 사용해서 문제를 풀도록 노력해봐야겠다.