# 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.