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: 5
“xyxyy” is the longest sub-string where
every character appears at least twice.
Input: s = “neveropen”, k = 2
Output: 2
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 <bits/stdc++.h>using namespace std;#define MAX 26// Function that return true if frequency// of all the present characters is at least kbool 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 zerovoid 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 timesint 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 codeint main(){ string str = "xyxyyz"; int n = str.length(); int k = 2; cout << findlength(str, n, k); return 0;} |
Java
// Java Implementation of the above approachclass GFG {static final int MAX = 26;// Function that return true if frequency// of all the present characters is at least kstatic 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 zerostatic 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 timesstatic 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 codepublic 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 approachusing System; class GFG {static int MAX = 26;// Function that return true if frequency// of all the present characters is at least kstatic 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 zerostatic 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 timesstatic 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 codepublic 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
<script>// Javascript implementation of the approachvar MAX = 26;// Function that return true if frequency// of all the present characters is at least kfunction atLeastK(freq, k){ for (var 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 zerofunction setZero(freq){ for (var 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 timesfunction findlength(str, n, k){ // To store the required maximum length var maxLen = 0; var freq = Array(MAX).fill(0); // Starting index of the sub-string for (var i = 0; i < n; i++) { setZero(freq); // Ending index of the sub-string for (var j = i; j < n; j++) { freq[str[j].charCodeAt(0) - 'a'.charCodeAt(0)]++; // 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 codevar str = "xyxyyz";var n = str.length;var k = 2;document.write( findlength(str, n, k));</script> |
5
Time Complexity: O(n2)
Auxiliary Space: O(MAX), where MAX is the maximum number of unique characters in the string.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
