Zero to Hero
article thumbnail
 

Longest Repeating Character Replacement - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

삽질 1 (실패)

from typing import *
from collections import defaultdict


# 주어진 문자열에서 지정된 횟수만큼 알파벳을 교환했을 때
# 동일한 문자로 구성된 부분 문자열의 길이의 최댓값을 반환하시오
class Solution:
    def characterReplacement(self, s: str, k: int) -> int:
        answer = 0
        list1 = list(s)
        dict1 = defaultdict(list)
        for index, char in enumerate(list1):
            dict1[char].append(index)
        # print(dict1["R"])
        for key in dict1:
            target_list = dict1[key]
            if len(target_list) == 1:
                temp = 1 + k if 1 + k <= len(s) else len(s)
                answer = max(answer, temp)
            else:
                left = k
                start, end = 0, 1
                temp_answer = 1
                prev = start
                while 0 <= start < end < len(target_list):
                    gap = target_list[end] - target_list[prev] - 1
                    if left - gap >= 0:
                        left -= gap
                        temp_answer += (gap + 1)
                        prev = end
                        end += 1
                    else:
                        end -= 1
                        left += (target_list[start + 1] - target_list[start] - 1)
                        temp_answer -= (target_list[start + 1] - target_list[start])
                        # if key == "R":
                        #     print(temp_answer, start, end, left)
                        answer = max(answer, temp_answer + left if temp_answer + left <= len(s) else len(s))
                        start += 1
                answer = max(answer, temp_answer)
        return answer

슬라이딩 윈도 까진 떠올렸다. 그런데 그걸 한꺼번에 하지 않고 알파벳마다 인덱스를 담은 배열을 순회하면서 인덱스 간격과 k를 비교하면서 업데이트해줬다. 이론은 맞는데 오류를 잡을 수 없었다.

 

정해 (성공)

from collections import Counter


class Solution:
    def characterReplacement(self, s: str, k: int) -> int:
        start, end = 0, 0
        counter = Counter()
        for end in range(1, len(s) + 1):
            counter[s[end - 1]] += 1
            most_common_char_num = counter.most_common(1)[0][1]
            if end - start - most_common_char_num > k:
                counter[s[start]] -= 1
                start += 1

        return end - start

그냥 한꺼번에 처리해도 현재 슬라이딩 윈도 안에 최빈 알파벳을 Counter를 이용해 해결한다.

 

'Algorithm' 카테고리의 다른 글

617. Merge Two Binary Trees  (0) 2021.04.21
14. Longest Common Prefix  (0) 2021.04.20
2174번: 로봇 시뮬레이션  (0) 2021.04.18
7. Reverse Integer  (0) 2021.04.17
104. Maximum Depth of Binary Tree  (0) 2021.04.16
profile

Zero to Hero

@Doljae

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!