Largest substring where all characters appear at least K times | Set 2

Given a string str and an integer K, the task is to find the length of the longest sub-string 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: We have discussed the Naive Approach in the previous post.
Approach: In this post, we will discuss the approach using Divide and Conquer technique and Recursion. Below are the steps:
- Store the frequency of each characters of the given string in a frequency array of size 26.
- Initialize two variables start with 0 and end which is the length of the string str.
- Iterate over the string from start to end and count the number of times each character repeats and store it in an array.
- If any character repeats less than K times, then Divide the string into two halves. If i is the index of the string where we found that the string[i] repeats less than K times, then we divide the string into two halves from start to i and i + 1 to end.
- Recursively call for the two halves in the above steps i.e., from start to i and i + 1 to end separately and repeat the Step 2 and 3 and return the maximum of the two values returned by the above recursive call.
- If all the characters between start and end is repeated at least K times, then the answer is end – start.
Below is the implementation of the above approach:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to find the longest substring int longestSubstring(int start, int end, string s, int k) { int left, right; // Array for counting the number of // times each character repeats // count the number of times each // character repeats from start to end int count[26] = { 0 }; // Store the frequency from s[start...end] for (int i = start; i < end; i++) { count[s[i] - 'a'] += 1; } // Iterate from [start, end] for (int i = start; i < end; i++) { if (count[s[i] - 'a'] < k) { // Recursive call for left subpart left = longestSubstring(start, i, s, k); // Recursive call for right subpart right = longestSubstring(i + 1, end, s, k); // Return maximum of left & right return max(left, right); } } // If all the characters are repeated // at least k times return end - start; } // Driver Code int main() { // Given String str string str = "aabbba"; int k = 3; // Function Call cout << longestSubstring(0, str.length(), str, k) << endl; return 0; } |
Java
// Java program for the above approach import java.util.*; class GFG{ // Function to find the longest subString static int longestSubString(int start, int end, String s, int k) { int left, right; // Array for counting the number of // times each character repeats // count the number of times each // character repeats from start to end int count[] = new int[26]; // Store the frequency from s[start...end] for(int i = start; i < end; i++) { count[s.charAt(i) - 'a'] += 1; } // Iterate from [start, end] for(int i = start; i < end; i++) { if (count[s.charAt(i) - 'a'] < k) { // Recursive call for left subpart left = longestSubString(start, i, s, k); // Recursive call for right subpart right = longestSubString(i + 1, end, s, k); // Return maximum of left & right return Math.max(left, right); } } // If all the characters are repeated // at least k times return end - start; } // Driver Code public static void main(String[] args) { // Given String str String str = "aabbba"; int k = 3; // Function Call System.out.print(longestSubString(0, str.length(), str, k) + "\n"); } } // This code is contributed by Amit Katiyar |
Python3
# Python3 program for the above approach # Function to find the longest substring def longestSubString(start, end, s, k): # List for counting the number of # times each character repeats # count the number of times each # character repeats from start to end count = [0 for i in range(26)] # Store the frequency from s[start...end] for i in range(start, end): count[ord(s[i]) - ord('a')] += 1 # Iterate from [start, end] for i in range(start, end): if(count[ ord(s[i]) - ord('a')] < k): # Recursive call for left subpart left = longestSubString(start, i, s, k) # Recursive call for right subpart right = longestSubString(i + 1, end, s, k) # Return maximum of left & right return max(left, right) # If all the characters are repeated # at least k times return end - start # Driver Code # Given String str str = "aabbba"k = 3# Function call print(longestSubString(0, len(str), str, k)) # This code is contributed by dadimadhav |
C#
// C# program for the above approachusing System;class GFG{// Function to find the longest subStringstatic int longestSubString(int start, int end, string s, int k){ int left, right; // Array for counting the number of // times each character repeats // count the number of times each // character repeats from start to end int []count = new int[26]; // Store the frequency from s[start...end] for(int i = start; i < end; i++) { count[s[i] - 'a'] += 1; } // Iterate from [start, end] for(int i = start; i < end; i++) { if (count[s[i] - 'a'] < k) { // Recursive call for left subpart left = longestSubString(start, i, s, k); // Recursive call for right subpart right = longestSubString(i + 1, end, s, k); // Return maximum of left & right return Math.Max(left, right); } } // If all the characters are repeated // at least k times return end - start;}// Driver Codepublic static void Main(string[] args){ // Given String str string str = "aabbba"; int k = 3; // Function call Console.Write(longestSubString(0, str.Length, str, k) + "\n");}}// This code is contributed by rutvik_56 |
Javascript
<script>// JavaScript program for the above approach // Function to find the longest subString function longestSubString(start, end, s, k) { var left, right; // Array for counting the number of // times each character repeats // count the number of times each // character repeats from start to end var count = new Array(26); // Store the frequency from s[start...end] for(var i = start; i < end; i++) { count[s.charAt(i) - 'a'] += 1; } // Iterate from [start, end] for(var i = start; i < end; i++) { if (count[s.charAt(i) - 'a'] < k) { // Recursive call for left subpart left = longestSubString(start, i, s, k); // Recursive call for right subpart right = longestSubString(i + 1, end, s, k); // Return maximum of left & right return Math.max(left, right); } } // If all the characters are repeated // at least k times return end - start; } // Driver Code // Given String str var str = "aabbba"; var k = 3; // Function Call document.write(longestSubString(0, str.length, str, k) + "\n"); // this code is contributed by shivanisinghss2110</script> |
6
Time Complexity: O(N*log2N)
Auxiliary Space: O(26) ? O(1), no extra space is required, so it is a constant.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!


