## Problem:

Given a string and a number k find the longest substring whose characters can be replaced by the most repeating character to a maximum of k times.

Example:

Given string = “ABAB” and k = 2

You can replace the substring “ABAB” with “BBBB” since the two A’s are not the most repeating character and their count is not greater than k = 2.

So the output is 4.

Similarly

Given the string AABABBA and k = 1

You can replace the substring “BABB” with “BBBB” since only one non repeating character can be replaced (k = 1) .

So the output is 4.

Try out the solution here:

https://leetcode.com/problems/longest-repeating-character-replacement/

## Solution:

## Hint:

- Use a sliding window , every time the number of characters within the window exceeds the given limit , slide the window by one position from the start. Return the maximum size the sliding window could expand in the process.

## ALGORITHM:

**STEP 1: **Initialize variables to store the start and end of the sliding window , the frequency of the characters in the window , the maximum count of repeating characters in the window and the maximum size of the sliding window

**STEP 2:** For each character in the string,

** STEP 2b:** Find the frequency of the current character

** STEP 2c:** If frequency is greater than any other characters in the current window , choose that as the maxCount

**STEP 2d: **Check if the window size without the repeating characters is greater than the given limit k. If so move the start pointer of the sliding window by one position . Also reduce the count of the start character from the frequency counter since it is no longer part of the current window now

**STEP 2e: **Find if the current window size is greater than the previous windows , if so assign it to the maximum size

**STEP 3:** Return maximum size

## Code:

class Solution { public int characterReplacement(String s, int k) { if(s.length() == 1) return 1; int start = 0; int maxCount = 0; int maxSize = 0; int freq[] = new int[26]; int end = 0; for(char c: s.toCharArray()){ int frequency = ++ freq[c - 'A'] ; maxCount = Math.max(maxCount,frequency); if(end - start + 1 - maxCount > k){ freq[s.charAt(start) - 'A'] --; start++; } maxSize = Math.max(maxSize,end - start +1); end++; } return maxSize; } }

Let’s take the example **AABABBA **with replacement character limit of 2 (k =2 )

Initial window has the first character “A”

Size of the window = 1

Size of the maximum count of any character = 1

Start and end of the window points to the same character .

Current window **[A]**

Increment the end pointer.

Now , pick the next character “A”

Size of the maximum count of any character = 2 ( No of A = 2 )

Size of the window = 2 (start pointer points to first character , end pointer points to second character)

Number of non repeating character = (window size – maximum count ) = 2-2 = 0

This is less than the given limit k = 2, so we don’t modify the window.

Current window – **[AA]**

Increment the end pointer

Now pick the next character B

Size of the maximum count of any character = 2 (A = 2 , B = 1)

Number of non repeating character = (window size – maximum count) = 3 – 2 = 1

This is less than the given limit 2, so we dont modify the window

Current window –** [AAB]**

Increment the end pointer

Now pick the next character A

Size of the maximum count of any character = 3 ( A = 3 , B = 1)

Number of non repeating characters = (window size – maximum count ) = 4 – 3 = 1

This is less than the given limit 2 , so we don’t modify the window

Current window –** [AABA]**

Increment the end pointer

Now pick the next character B

Size of the maximum count of any character = 3 ( A= 3, B = 2)

Number of non repeating characters = (window size – maximum count ) = 5 – 3 = 2

This is less than the given limit 2 , so we dont modify

Current window –** [AABAB]**

Increment the end pointer

Now pick the next character B

Size of the maximum count of any character = 3 (A = 3 , B = 3)

Number of non repeating characters = (window size – maximum count) = 6- 3 = 3

This is greater than the given limit 2 , so we slide the start of the window by one position

We leave out the first letter

So current window – **[ABABB]**

Increment the end pointer

Now pick the next character A

Size of the maximum count of any character = 3 (A = 3 , B = 3)

Number of non repeating characters = (window size – maximum count) = 6 – 3 = 3

This is greater than the given limit 2 , so we slide the start of the window by one position

We leave out the first letter of the current window

So current window – **[BABBA]**

We have reached the end of the string now and the longest substring we have got is BABBA . The letter A in the above string can be replaced by B since it occurs only twice ( limit k = 2) so it becomes BBBBB.

The output is then 5.