DEV Community

Prashant Mishra
Prashant Mishra

Posted on

Longest repeating character replacement

problem

//brute force : O(n^2)
//ps : brute force is not giving TLE in leetcode submission :)

class Solution {
    public int characterReplacement(String s, int k) {
        //brute force approach :
        //getting all the substrings and finding out which can give the longest substring with repeating character
        int maxLen = 0;

        for(int i =0;i<s.length();i++){
            int arr[] = new int[26];
            int maxCount =0;
            for(int  j = i;j<s.length();j++){
                char c  = s.charAt(j);
                arr[c-'A']++;
                maxCount  = Integer.max(maxCount,arr[c-'A']);
                if(j-i+1 - maxCount <=k){
                    maxLen = Integer.max(maxLen, j-i+1);
                }
                else break; // else break out because the j-i+1-maxCount will always be greater than k in the current loop
            }
        }
        return maxLen;
    }
}
Enter fullscreen mode Exit fullscreen mode

Better approach:

//O(2n) : o(n)for right pointer moving till the end of the String s length, O(n) for left pointer as in worst case left will also move till s.length()-2 index

class Solution {
    public int characterReplacement(String s, int k) {
        //two pointer sliding window protocol

        int left  =0;
        int right = 0;
        int arr[] = new int[26];
        int max = 0;
        int len  =0;
        while(right<s.length()){
            char c = s.charAt(right);
            arr[c-'A']++; //keep count of character in the array
            max  = Integer.max(max,arr[c-'A']); // get the max repeating character count
            while(right-left+1-max > k){ // if the no. of character to be replaced is more than allowed(k) then
// we will have to remove character 
//from left and decrement the character at index left by 1, and increment the left pointer by 1 to point to next 
//character i.e left+1
                arr[s.charAt(left)-'A']--;
                left++;
            }
            len  = Integer.max(len, right-left+1);
            right++;
        }
        return len;
    }
} 

Enter fullscreen mode Exit fullscreen mode

Optimal approach:

//O(n) 

class Solution {
    public int characterReplacement(String s, int k) {
        //two pointer sliding window protocol

        int left  =0;
        int right = 0;
        int arr[] = new int[26];
        int max = 0;
        int len  =0;
        while(right<s.length()){
            char c = s.charAt(right);
            arr[c-'A']++;
            max  = Integer.max(max,arr[c-'A']);
            if(right-left+1-max > k){
                arr[s.charAt(left)-'A']--;
                left++;
            }
            len  = Integer.max(len, right-left+1);
            right++;
        }
        return len;
    }
} 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)