Get the best out of our app
GeeksforGeeks App
Open App
Browser
Continue

# Largest sub-string where all the characters appear at least K times

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.

Input: s = “xyxyyz”, k = 2
Output:
“xyxyy” is the longest sub-string where
every character appears at least twice.
Input: s = “geeksforgeeks”, k = 2
Output:

Approach: Consider all the possible sub-strings and for every sub-string, calculate the frequency of each of its character and check whether all the characters appear at least K times. For all such valid sub-strings, find the largest length possible.
Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;` `#define MAX 26` `// Function that return true if frequency``// of all the present characters is at least k``bool` `atLeastK(``int` `freq[], ``int` `k)``{``    ``for` `(``int` `i = 0; i < MAX; i++) {` `        ``// If the character is present and``        ``// its frequency is less than k``        ``if` `(freq[i] != 0 && freq[i] < k)``            ``return` `false``;``    ``}` `    ``return` `true``;``}` `// Function to set every frequency to zero``void` `setZero(``int` `freq[])``{``    ``for` `(``int` `i = 0; i < MAX; i++)``        ``freq[i] = 0;``}` `// Function to return the length of the longest``// sub-string such that it contains every``// character at least k times``int` `findlength(string str, ``int` `n, ``int` `k)``{` `    ``// To store the required maximum length``    ``int` `maxLen = 0;` `    ``int` `freq[MAX];` `    ``// Starting index of the sub-string``    ``for` `(``int` `i = 0; i < n; i++) {``        ``setZero(freq);` `        ``// Ending index of the sub-string``        ``for` `(``int` `j = i; j < n; j++) {``            ``freq[str[j] - ``'a'``]++;` `            ``// If the frequency of every character``            ``// of the current sub-string is at least k``            ``if` `(atLeastK(freq, k)) {` `                ``// Update the maximum possible length``                ``maxLen = max(maxLen, j - i + 1);``            ``}``        ``}``    ``}` `    ``return` `maxLen;``}` `// Driver code``int` `main()``{``    ``string str = ``"xyxyyz"``;``    ``int` `n = str.length();``    ``int` `k = 2;` `    ``cout << findlength(str, n, k);` `    ``return` `0;``}`

## Java

 `// Java Implementation of the above approach``class` `GFG``{` `static` `final` `int` `MAX = ``26``;` `// Function that return true if frequency``// of all the present characters is at least k``static` `boolean` `atLeastK(``int` `freq[], ``int` `k)``{``    ``for` `(``int` `i = ``0``; i < MAX; i++)``    ``{` `        ``// If the character is present and``        ``// its frequency is less than k``        ``if` `(freq[i] != ``0` `&& freq[i] < k)``            ``return` `false``;``    ``}` `    ``return` `true``;``}` `// Function to set every frequency to zero``static` `void` `setZero(``int` `freq[])``{``    ``for` `(``int` `i = ``0``; i < MAX; i++)``        ``freq[i] = ``0``;``}` `// Function to return the length of the longest``// sub-string such that it contains every``// character at least k times``static` `int` `findlength(String str, ``int` `n, ``int` `k)``{` `    ``// To store the required maximum length``    ``int` `maxLen = ``0``;` `    ``int` `freq[] = ``new` `int``[MAX];` `    ``// Starting index of the sub-string``    ``for` `(``int` `i = ``0``; i < n; i++)``    ``{``        ``setZero(freq);` `        ``// Ending index of the sub-string``        ``for` `(``int` `j = i; j < n; j++)``        ``{``            ``freq[str.charAt(j) - ``'a'``]++;` `            ``// If the frequency of every character``            ``// of the current sub-string is at least k``            ``if` `(atLeastK(freq, k))``            ``{` `                ``// Update the maximum possible length``                ``maxLen = Math.max(maxLen, j - i + ``1``);``            ``}``        ``}``    ``}` `    ``return` `maxLen;``}` `// Driver code``public` `static` `void` `main(String args[])``{``    ``String str = ``"xyxyyz"``;``    ``int` `n = str.length();``    ``int` `k = ``2``;` `    ``System.out.println(findlength(str, n, k));` `}``}` `// This code has been contributed by 29AjayKumar`

## Python3

 `# Python3 implementation of the approach``MAX` `=` `26` `# Function that return true if frequency``# of all the present characters is at least k``def` `atLeastK(freq, k) :` `    ``for` `i ``in` `range``(``MAX``) :` `        ``# If the character is present and``        ``# its frequency is less than k``        ``if` `(freq[i] !``=` `0` `and` `freq[i] < k) :``            ``return` `False``;``    ` `    ``return` `True``;`  `# Function to set every frequency to zero``def` `setZero(freq) :` `    ``for` `i ``in` `range``(``MAX``) :``        ``freq[i] ``=` `0``;`  `# Function to return the length of the longest``# sub-string such that it contains every``# character at least k times``def` `findlength(string, n, k) :` `    ``# To store the required maximum length``    ``maxLen ``=` `0``;` `    ``freq ``=` `[``0``]``*``MAX``;` `    ``# Starting index of the sub-string``    ``for` `i ``in` `range``(n) :``        ``setZero(freq);` `        ``# Ending index of the sub-string``        ``for` `j ``in` `range``(i,n) :``            ``freq[``ord``(string[j]) ``-` `ord``(``'a'``)] ``+``=` `1``;` `            ``# If the frequency of every character``            ``# of the current sub-string is at least k``            ``if` `(atLeastK(freq, k)) :` `                ``# Update the maximum possible length``                ``maxLen ``=` `max``(maxLen, j ``-` `i ``+` `1``);``        ` `    ``return` `maxLen;`  `# Driver code``if` `__name__ ``=``=` `"__main__"` `:` `    ``string ``=` `"xyxyyz"``;``    ``n ``=` `len``(string);``    ``k ``=` `2``;` `    ``print``(findlength(string, n, k));``    ` `# This code is contributed by AnkitRai01`

## C#

 `// C# Implementation of the above approach``using` `System;``    ` `class` `GFG``{` `static` `int` `MAX = 26;` `// Function that return true if frequency``// of all the present characters is at least k``static` `Boolean atLeastK(``int` `[]freq, ``int` `k)``{``    ``for` `(``int` `i = 0; i < MAX; i++)``    ``{` `        ``// If the character is present and``        ``// its frequency is less than k``        ``if` `(freq[i] != 0 && freq[i] < k)``            ``return` `false``;``    ``}` `    ``return` `true``;``}` `// Function to set every frequency to zero``static` `void` `setZero(``int` `[]freq)``{``    ``for` `(``int` `i = 0; i < MAX; i++)``        ``freq[i] = 0;``}` `// Function to return the length of the longest``// sub-string such that it contains every``// character at least k times``static` `int` `findlength(String str, ``int` `n, ``int` `k)``{` `    ``// To store the required maximum length``    ``int` `maxLen = 0;` `    ``int` `[]freq = ``new` `int``[MAX];` `    ``// Starting index of the sub-string``    ``for` `(``int` `i = 0; i < n; i++)``    ``{``        ``setZero(freq);` `        ``// Ending index of the sub-string``        ``for` `(``int` `j = i; j < n; j++)``        ``{``            ``freq[str[j] - ``'a'``]++;` `            ``// If the frequency of every character``            ``// of the current sub-string is at least k``            ``if` `(atLeastK(freq, k))``            ``{` `                ``// Update the maximum possible length``                ``maxLen = Math.Max(maxLen, j - i + 1);``            ``}``        ``}``    ``}` `    ``return` `maxLen;``}` `// Driver code``public` `static` `void` `Main(String []args)``{``    ``String str = ``"xyxyyz"``;``    ``int` `n = str.Length;``    ``int` `k = 2;` `    ``Console.WriteLine(findlength(str, n, k));``}``}` `// This code is contributed by Princi Singh`

## Javascript

 ``

Output:

`5`

Time Complexity: O(n2)
Auxiliary Space: O(MAX), where MAX is the maximum number of unique characters in the string.

My Personal Notes arrow_drop_up