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++
#include <bits/stdc++.h>
using namespace std;
int longestSubstring( int start, int end,
string s, int k)
{
int left, right;
int count[26] = { 0 };
for ( int i = start; i < end; i++) {
count[s[i] - 'a' ] += 1;
}
for ( int i = start; i < end; i++) {
if (count[s[i] - 'a' ] < k) {
left = longestSubstring(start,
i,
s,
k);
right = longestSubstring(i + 1,
end,
s,
k);
return max(left, right);
}
}
return end - start;
}
int main()
{
string str = "aabbba" ;
int k = 3;
cout << longestSubstring(0, str.length(),
str, k)
<< endl;
return 0;
}
|
Java
import java.util.*;
class GFG{
static int longestSubString( int start, int end,
String s, int k)
{
int left, right;
int count[] = new int [ 26 ];
for ( int i = start; i < end; i++)
{
count[s.charAt(i) - 'a' ] += 1 ;
}
for ( int i = start; i < end; i++)
{
if (count[s.charAt(i) - 'a' ] < k)
{
left = longestSubString(start, i,
s, k);
right = longestSubString(i + 1 , end,
s, k);
return Math.max(left, right);
}
}
return end - start;
}
public static void main(String[] args)
{
String str = "aabbba" ;
int k = 3 ;
System.out.print(longestSubString( 0 , str.length(),
str, k) + "\n" );
}
}
|
Python3
def longestSubString(start, end, s, k):
count = [ 0 for i in range ( 26 )]
for i in range (start, end):
count[ ord (s[i]) - ord ( 'a' )] + = 1
for i in range (start, end):
if (count[ ord (s[i]) - ord ( 'a' )] < k):
left = longestSubString(start, i,
s, k)
right = longestSubString(i + 1 , end,
s, k)
return max (left, right)
return end - start
str = "aabbba"
k = 3
print (longestSubString( 0 , len ( str ), str , k))
|
C#
using System;
class GFG{
static int longestSubString( int start, int end,
string s, int k)
{
int left, right;
int []count = new int [26];
for ( int i = start; i < end; i++)
{
count[s[i] - 'a' ] += 1;
}
for ( int i = start; i < end; i++)
{
if (count[s[i] - 'a' ] < k)
{
left = longestSubString(start, i,
s, k);
right = longestSubString(i + 1, end,
s, k);
return Math.Max(left, right);
}
}
return end - start;
}
public static void Main( string [] args)
{
string str = "aabbba" ;
int k = 3;
Console.Write(longestSubString(0, str.Length,
str, k) + "\n" );
}
}
|
Javascript
<script>
function longestSubString(start, end, s, k)
{
var left, right;
var count = new Array(26);
for ( var i = start; i < end; i++)
{
count[s.charAt(i) - 'a' ] += 1;
}
for ( var i = start; i < end; i++)
{
if (count[s.charAt(i) - 'a' ] < k)
{
left = longestSubString(start, i,
s, k);
right = longestSubString(i + 1, end,
s, k);
return Math.max(left, right);
}
}
return end - start;
}
var str = "aabbba" ;
var k = 3;
document.write(longestSubString(0, str.length, str, k) + "\n" );
</script>
|
Time Complexity: O(N*log2N)
Auxiliary Space: O(26) ? O(1), no extra space is required, so it is a constant.
Last Updated :
03 Jan, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...