|
| 1 | +# https://leetcode.com/problems/longest-repeating-character-replacement/ |
| 2 | + |
| 3 | +class Solution: |
| 4 | + def characterReplacement(self, s: str, k: int) -> int: |
| 5 | + """ |
| 6 | + [Complexity] |
| 7 | + - TC: O(n) |
| 8 | + - SC: O(n) |
| 9 | +
|
| 10 | + [Approach] |
| 11 | + two pointer๋ก sliding window๋ฅผ ์ด๋ํด๊ฐ๋ฉด์, k๋ฒ ์ด๋ด๋ก replace ํ์ ๋ ๋ชจ๋ ๊ฐ์ ๋ฌธ์๊ฐ ๋ ๋์ max_len๋ฅผ ํธ๋ํนํ๋ฉด ๋๋ค. |
| 12 | + ์ด๋, ์ด substring์ ๋ชจ๋ ๊ฐ์ ๋ฌธ์๋ก ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ์์ replacement ํ์๋ฅผ ๊ตฌํด k์ ๋น๊ตํด์ผ ํ๋๋ฐ, |
| 13 | + ์ด ํ์ max_replace๋ (substring์ ๊ธธ์ด - ๊ฐ์ฅ ๋น๋๊ฐ ๋์ ๋ฌธ์์ ๋ฑ์ฅ ํ์) ์ด๋ค. |
| 14 | + max_replace๊ฐ k ์ดํ๋ผ๋ฉด max_len์ ์
๋ฐ์ดํธํ๊ณ , ์๋๋ผ๋ฉด left๋ฅผ ํ ์นธ ์ ์งํ๋ค. |
| 15 | + """ |
| 16 | + from collections import defaultdict |
| 17 | + |
| 18 | + left = max_len = max_freq = 0 # left ~ right: k๋ฒ ์ด๋ด๋ก replace ํ์ ๋, ๋ชจ๋ ๊ฐ์ ๋ฌธ์์ผ ๋์ max_len ์
๋ฐ์ดํธ |
| 19 | + cnt = defaultdict(int) # left ~ right sliding window ๋ด์์์ counter |
| 20 | + |
| 21 | + # right ํ ์นธ์ฉ ์ด๋ํด๊ฐ๋ฉฐ ํ์ธ |
| 22 | + for right in range(len(s)): |
| 23 | + # max_freq ์
๋ฐ์ดํธ |
| 24 | + cnt[s[right]] += 1 |
| 25 | + max_freq = max(max_freq, cnt[s[right]]) |
| 26 | + |
| 27 | + # ํ์ฌ sliding window๋ฅผ ๋ชจ๋ ๊ฐ์ ๋ฌธ์๋ก ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ์์ replacement ํ์ ๊ตฌํ๊ธฐ |
| 28 | + sub_len = right - left + 1 |
| 29 | + min_replace = sub_len - max_freq |
| 30 | + |
| 31 | + # min_replace๊ฐ k ์ดํ์ด๋ฉด, max_len ์
๋ฐ์ดํธ |
| 32 | + if min_replace <= k: |
| 33 | + max_len = max(max_len, sub_len) |
| 34 | + # ์๋๋ผ๋ฉด, left ํ ์นธ ์ด๋ |
| 35 | + else: |
| 36 | + cnt[s[left]] -= 1 |
| 37 | + left += 1 |
| 38 | + |
| 39 | + return max_len |
0 commit comments