📌  相关文章
📜  由相同字符组成的长度为K的子字符串的最大数目

📅  最后修改于: 2021-04-27 22:41:38             🧑  作者: Mango

给定一个字符串str和一个整数k 。任务是计算由相同字符组成的长度为k的子字符串的出现次数。可能有多个这样的长度为k的子字符串,请选择出现次数最多的一个作为str的子字符串(不重叠)的计数。

例子:

方法:迭代所有从字符“a”“Z”和计数长度为k的仅由当前字符的字符串显示为STR的子串的次数。最后打印这些计数的最大值。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function to return the count
// of the required sub-strings
int maxSubStrings(string s, int k)
{
    int maxSubStr = 0, n = s.size();
  
    // Iterate over all characters
    for (int c = 0; c < 26; c++) {
        char ch = 'a' + c;
  
        // Count with current character
        int curr = 0;
        for (int i = 0; i <= n - k; i++) {
            if (s[i] != ch)
                continue;
            int cnt = 0;
            while (i < n && s[i] == ch && cnt != k) {
                i++;
                cnt++;
            }
            i--;
  
            // If the substring has a length k
            // then increment count with current character
            if (cnt == k)
                curr++;
        }
  
        // Update max count
        maxSubStr = max(maxSubStr, curr);
    }
    return maxSubStr;
}
  
// Driver Code
int main()
{
    string s = "aaacaabbaa";
    int k = 2;
    cout << maxSubStrings(s, k);
  
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
import java.lang.*;
import java.io.*;
  
class GFG
{
      
// Function to return the count
// of the required sub-strings
static int maxSubStrings(String s, int k)
{
    int maxSubStr = 0, n = s.length();
  
    // Iterate over all characters
    for (int c = 0; c < 26; c++) 
    {
        char ch = (char)((int)'a' + c);
  
        // Count with current character
        int curr = 0;
        for (int i = 0; i <= n - k; i++) 
        {
            if (s.charAt(i) != ch)
                continue;
            int cnt = 0;
            while (i < n && s.charAt(i) == ch &&
                                        cnt != k) 
            {
                i++;
                cnt++;
            }
            i--;
  
            // If the substring has a length
            //  k then increment count with 
            // current character
            if (cnt == k)
                curr++;
        }
  
        // Update max count
        maxSubStr = Math.max(maxSubStr, curr);
    }
    return maxSubStr;
}
  
// Driver Code
public static void main(String []args)
{
    String s = "aaacaabbaa";
    int k = 2;
    System.out.println(maxSubStrings(s, k));
}
}
  
// This code is contributed by 
// tufan_gupta2000


Python3
# Python 3 implementation of the approach
  
# Function to return the count
# of the required sub-strings
def maxSubStrings(s, k):
    maxSubStr = 0
    n = len(s)
  
    # Iterate over all characters
    for c in range(27):
        ch = chr(ord('a') + c)
  
        # Count with current character
        curr = 0
        for i in range(n - k):
            if (s[i] != ch):
                continue
            cnt = 0
            while (i < n and s[i] == ch and 
                                   cnt != k):
                i += 1
                cnt += 1
      
            i -= 1
  
            # If the substring has a length k then
            # increment count with current character
            if (cnt == k):
                curr += 1
  
        # Update max count
        maxSubStr = max(maxSubStr, curr)
  
    return maxSubStr
  
# Driver Code
if __name__ == '__main__':
    s = "aaacaabbaa"
    k = 2
    print(maxSubStrings(s, k))
  
# This code is contributed by
# Surendra_Gangwar


C#
// C# implementation of the approach 
using System;
  
class GFG 
{ 
          
    // Function to return the count 
    // of the required sub-strings 
    static int maxSubStrings(String s, int k) 
    { 
        int maxSubStr = 0, n = s.Length; 
      
        // Iterate over all characters 
        for (int c = 0; c < 26; c++) 
        { 
            char ch = (char)((int)'a' + c); 
      
            // Count with current character 
            int curr = 0; 
            for (int i = 0; i <= n - k; i++) 
            { 
                if (s[i] != ch) 
                    continue; 
                int cnt = 0; 
                while (i < n && s[i] == ch && 
                                cnt != k) 
                { 
                    i++; 
                    cnt++; 
                } 
                i--; 
      
                // If the substring has a length 
                // k then increment count with 
                // current character 
                if (cnt == k) 
                    curr++; 
            } 
      
            // Update max count 
            maxSubStr = Math.Max(maxSubStr, curr); 
        } 
        return maxSubStr; 
    } 
      
    // Driver Code 
    public static void Main() 
    { 
        string s = "aaacaabbaa"; 
        int k = 2; 
        Console.WriteLine(maxSubStrings(s, k)); 
    } 
}
  
// This code is contributed by Ryuga


输出:
3

时间复杂度: O(n),其中n是字符串的长度。