[LeetCode] 424. Longest Repeating Character Replacement
대문자로 이루어져있는 문자열과 k
가 주어졌을 때, k
개만큼 문자를 교체해서 만들 수 있는 같은 문자로 이루어진 부분 문자열의 최대 길이를 구하는 문제다.
알고리즘 스터디에서 푼 문제 중 처음으로 내 힘으로 해결하지 못한 문제다..
투포인터를 사용해야될 것 같긴 한데 내가 생각한 방법으론 도저히 시간복잡도를 보다 낮게 줄일 수 없었다.
결국 해당 문제의 solutions에 올라온 코드 중 하나를 참고해 해결하였다.
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
if len(s) == k:
return k
s_set = set(s)
result = set()
for char in s_set:
left, right, count = 0, 0, 0
while right < len(s):
if s[right] == char:
right += 1
elif count < k:
count += 1
right += 1
elif s[left] == char:
left += 1
else:
count -= 1
left += 1
result.add(right-left)
return max(result)
s
에 있는 문자의 종류만큼 탐색을 하게된다. = char
left
, 끝 인덱스인 right
, 해당 윈도우에서 바꾼 문자의 수인 count
를 조작하며 탐색이 진행된다.right
를 먼저 조작하게 된다.char
와 같다면 윈도우의 크기를 한 칸 늘린다.char
와 다르고 바꾼 문자의 개수가 k
보다 작으면, count
를 증가시키고 윈도우의 크기를 한 칸 늘린다.left
를 조작한다.char
와 같다면 윈도우의 크기를 한 칸 줄인다.char
와 다르다면 count
를 감소시키고 윈도우의 크기를 한 칸 줄인다.result
에 윈도우의 크기를 저장한다.