给定一个字符串str和一个整数K,任务是找到最长的子串S的长度“使得S中的每一个字符”至少K次出现。
Input: s = “xyxyyz”, k = 2
Output: 5
“xyxyy” is the longest sub-string where
every character appears at least twice.
Input: s = “geeksforgeeks”, k = 2
Output: 2
方法:考虑所有可能的子字符串,并为每个子字符串计算每个字符的频率,并检查所有字符是否至少出现K次。对于所有这样的有效子字符串,请找到最大可能的长度。
下面是上述方法的实现:
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 requried 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 requried 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 requried 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 requried 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
输出:
5