Given a string str and an integer K, the task is to find the length of the longest substring S such that every character in S appears at least K times.
Examples:
Input: str = “aabbba”, K = 3
Output: 6
Explanation: In substring "aabbba", each character repeats at least k times and its length is 6.
Input: str = “ababacb”, K = 3
Output: 0
Explanation: There is no substring where each character repeats at least k times.
Naive Approach: The simplest approach to solve the given problem is discussed in Set 1.
Time Complexity: O(N2)
Auxiliary Space: O(26)
Divide and Conquer Approach: The divide and conquer approach for the given problem is discussed in the Set 2.
Time Complexity: O(N*log N)
Auxiliary Space: O(26)
Efficient Approach: The above two approaches can be optimized further by using Sliding Window technique. Follow the steps below to solve the problem:
- Store the number of unique characters in the string str in a variable, say unique.
- Initialize an array freq[] of size 26 with {0} and store the frequency of each character in this array.
- Iterate over the range [1, unique] using the variable curr_unique. In each iteration, curr_unique is the maximum number of unique characters that must be present in the window.
- Reinitialize the array freq[] with {0} to store the frequency of each character in this window.
- Initialize start and end as 0, to store the starting and the ending point of the window respectively.
- Use two variables cnt, for storing the number of unique characters and countK, for storing the number of characters with at least K repeating characters in the current window.
- Now, iterate a loop while end < N, and perform the following:
- If the value of cnt is less than or equals to curr_unique, then expand the window from the right by adding a character to the end of the window. And increment its frequency by 1 in freq[].
- Otherwise, reduce the window from the left by removing a character from start and decrementing its frequency by 1 in freq[].
- At every step, update the values of cnt and countK.
- If the value of cnt is same as curr_unique and each character occurs at least K times, then update the overall maximum length and store it in ans.
- After completing the above steps, print the value of ans as the result.
Below is the implementation of the above approach:
Time Complexity: O(N)
Auxiliary Space: O(1)