# O(n) time | O(1) space
def character_replacement(self, s: str, k: int) -> int:
freq, max_freq, res = collections.defaultdict(int), 0, 0
low = 0
for high in range(len(s)):
freq[s[high]] += 1
max_freq = max(max_freq, freq[s[high]])
if (high - low + 1) - max_freq > k:
freq[s[low]] -= 1
low += 1
res = max(res, high - low + 1)
return res
Detailed Explanation:
-
Initialize Variables:
freq
: A dictionary to store the frequency of each character in the current window.
max_freq
: Tracks the maximum frequency of any character in the current window.
low
: Pointer for the start of the window.
res
: Keeps track of the maximum length of a valid window seen so far.
-
Iterate Through the String:
- We use a for loop to iterate through the string, with
high
as the end pointer of the window.
- At each step, we include the character at the
high
position in our window and update its freq
in the count
dictionary.
- We update
max_freq
to reflect the highest frequency of any character in the current window.
-
Validate the Window:
- A window is valid if the number of replacements required to make all characters in it the same does not
exceed
k
.
This is checked by the condition (high - low + 1) - max_freq > k
, which calculates the number of characters that
are different from the most frequent character.
- If the window becomes invalid, we shrink it from the
low
by increasing the left pointer and updating the count
of the character at the low
position.
-
Update Maximum Length:
- If the window is valid, we update
res
to be the maximum of its current value and the size of the current
window.