// Longest Repeating Character Replacement - https://leetcode.com/problems/longest-repeating-character-replacement/description/ class Solution { // Brute Force // Time Complexity: O(n^2) // Space Complexity: O(m) where m is number of letters in alphabet (26) // public int characterReplacement(String s, int k) { // int maxLength = 0; // for (int i = 0; i < s.length(); i++) { // Map freq = new HashMap<>(); // int maxF = 0; // for (int j = i; j < s.length(); j++) { // char c = s.charAt(j); // freq.put(c, freq.getOrDefault(c, 0) + 1); // maxF = Math.max(maxF, freq.get(c)); // // len of current substring - count of most frequent character // if((j - i + 1) - maxF <= k) { // maxLength = Math.max(maxLength, (j - i + 1)); // } // } // } // return maxLength; // } // Sliding Window // Time Complexity: O(26.n) ~ O(n) // Space Complexity: O(26) ~ O(1) // public int characterReplacement(String s, int k) { // int maxLength = 0; // int l = 0; // Map freq = new HashMap<>(); // for (int r = 0; r < s.length(); r++) { // char c = s.charAt(r); // freq.put(c, freq.getOrDefault(c, 0) + 1); // int maxF = Collections.max(freq.values()); // int lenOfWindow = r - l + 1; // if(lenOfWindow - maxF <= k) { // maxLength = Math.max(maxLength, lenOfWindow); // } else { // while(lenOfWindow - maxF > k) { // char leftChar = s.charAt(l); // freq.put(leftChar, freq.get(leftChar) - 1); // l++; // lenOfWindow--; // } // } // } // return maxLength; // } // Sliding Window (Optimised) // Time Complexity: O(n) // Space Complexity: O(26) ~ O(1) public int characterReplacement(String s, int k) { int maxLength = 0; int l = 0; Map freq = new HashMap<>(); int maxF = 0; for (int r = 0; r < s.length(); r++) { char c = s.charAt(r); freq.put(c, freq.getOrDefault(c, 0) + 1); maxF = Math.max(maxF, freq.get(c)); while((r - l + 1) - maxF > k) { char leftChar = s.charAt(l); freq.put(leftChar, freq.get(leftChar) - 1); l++; } maxLength = Math.max(maxLength, (r - l + 1)); } return maxLength; } }