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)