📌  相关文章
📜  所有字符至少出现K次的最大子字符串

📅  最后修改于: 2021-05-04 10:07:33             🧑  作者: Mango

给定一个字符串str和一个整数K,任务是找到最长的子串S的长度使得S中的每一个字符至少K次出现。

方法:考虑所有可能的子字符串,并为每个子字符串计算每个字符的频率,并检查所有字符是否至少出现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