📌  相关文章
📜  由最大不同字符组成的最小子字符串的长度

📅  最后修改于: 2021-10-27 08:54:34             🧑  作者: Mango

给定一个长度为 N 的字符串,找出由最大不同字符组成的最小子字符串的长度。注意:我们的输出可以具有相同的字符。

例子:

Input : "AABBBCBB"
Output : 5

Input : "AABBBCBBAC"
Output : 3
Explanation : Sub-string -> "BAC"

Input : "GEEKSGEEKSFOR"
Output : 8
Explanation : Sub-string -> "GEEKSFOR"

方法一(蛮力)

我们可以一一考虑所有子串,并一起检查每个子串的两个条件
1. 子串的不同字符数等于最大不同字符
2. 子串的长度应该是最小的。

时间复杂度: O(n^3)

C++
/* C++ program to find the length of the smallest
substring consisting of maximum distinct characters */
#include 
using namespace std;
 
#define NO_OF_CHARS 256
 
// Find maximum distinct characters in any string
int max_distinct_char(string str, int n){
 
    // Initialize all character's count with 0
    int count[NO_OF_CHARS] = {0};
     
    // Increase the count in array if a character
    // is found
    for (int i = 0; i < n;  i++)
        count[str[i]]++;
     
    int max_distinct = 0;
    for (int i = 0; i < NO_OF_CHARS;  i++)
        if (count[i] != 0)     
            max_distinct++;    
     
    return max_distinct;
}
 
int smallesteSubstr_maxDistictChar(string str){
 
    int n = str.size();     // size of given string
 
    // Find maximum distinct characters in any string
    int max_distinct = max_distinct_char(str, n);
    int minl = n;   // result
     
    // Brute force approach to find all substrings
    for (int i=0 ;i


Java
/* Java program to find the length of the smallest
substring consisting of maximum distinct characters */
class GFG {
 
    final static int NO_OF_CHARS = 256;
 
// Find maximum distinct characters in any string
    static int max_distinct_char(String str, int n) {
 
        // Initialize all character's count with 0
        int count[] = new int[NO_OF_CHARS];
 
        // Increase the count in array if a character
        // is found
        for (int i = 0; i < n; i++) {
            count[str.charAt(i)]++;
        }
 
        int max_distinct = 0;
        for (int i = 0; i < NO_OF_CHARS; i++) {
            if (count[i] != 0) {
                max_distinct++;
            }
        }
 
        return max_distinct;
    }
 
    static int smallesteSubstr_maxDistictChar(String str) {
 
        int n = str.length();     // size of given string
 
        // Find maximum distinct characters in any string
        int max_distinct = max_distinct_char(str, n);
        int minl = n;   // result
 
        // Brute force approach to find all substrings
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                 
                String subs = null;
                if(i


Python3
# Python 3 program to find the length
# of the smallest substring consisting
# of maximum distinct characters
NO_OF_CHARS = 256
 
# Find maximum distinct characters
# in any string
def max_distinct_char(str, n):
 
    # Initialize all character's
    # count with 0
    count = [0] * NO_OF_CHARS
     
    # Increase the count in array
    # if a character is found
    for i in range(n):
        count[ord(str[i])] += 1
     
    max_distinct = 0
    for i in range(NO_OF_CHARS):
        if (count[i] != 0):
            max_distinct += 1   
     
    return max_distinct
 
def smallesteSubstr_maxDistictChar(str):
 
    n = len(str)     # size of given string
 
    # Find maximum distinct characters
    # in any string
    max_distinct = max_distinct_char(str, n)
    minl = n     # result
     
    # Brute force approach to
    # find all substrings
    for i in range(n):
        for j in range(n):
            subs = str[i:j]
            subs_lenght = len(subs)
            sub_distinct_char = max_distinct_char(subs,
                                                  subs_lenght)
             
            # We have to check here both conditions together
            # 1. substring's distinct characters is equal
            # to maximum distinct characters
            # 2. substring's length should be minimum
            if (subs_lenght < minl and
                max_distinct == sub_distinct_char):
                minl = subs_lenght
 
    return minl
 
# Driver Code
if __name__ == "__main__":
     
    # Input String
    str = "AABBBCBB"
     
    l = smallesteSubstr_maxDistictChar(str);
    print( "The length of the smallest substring",
           "consisting of maximum distinct",
           "characters :", l)
 
# This code is contributed by ChitraNayal


C#
/* C# program to find the length of the smallest
substring consisting of maximum distinct characters */
using System;
     
class GFG
{
 
    static int NO_OF_CHARS = 256;
 
    // Find maximum distinct characters in any string
    static int max_distinct_char(String str, int n)
    {
 
        // Initialize all character's count with 0
        int []count = new int[NO_OF_CHARS];
 
        // Increase the count in array if a character
        // is found
        for (int i = 0; i < n; i++)
        {
            count[str[i]]++;
        }
 
        int max_distinct = 0;
        for (int i = 0; i < NO_OF_CHARS; i++)
        {
            if (count[i] != 0)
            {
                max_distinct++;
            }
        }
 
        return max_distinct;
    }
 
    static int smallesteSubstr_maxDistictChar(String str)
    {
 
        int n = str.Length;     // size of given string
 
        // Find maximum distinct characters in any string
        int max_distinct = max_distinct_char(str, n);
        int minl = n; // result
 
        // Brute force approach to find all substrings
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                 
                String subs = null;
                if(i < j)
                    subs = str.Substring(i, str.Length-j);
                else
                    subs = str.Substring(j, str.Length-i);
                int subs_lenght = subs.Length;
                int sub_distinct_char = max_distinct_char(subs, subs_lenght);
 
                // We have to check here both conditions together
                // 1. substring's distinct characters is equal
                // to maximum distinct characters
                // 2. substring's length should be minimum
                if (subs_lenght < minl && max_distinct == sub_distinct_char)
                {
                    minl = subs_lenght;
                }
            }
        }
        return minl;
    }
 
    /* Driver program to test above function */
    static public void Main(String[] args)
    {
        // Input String
        String str = "AABBBCBB";
 
        int len = smallesteSubstr_maxDistictChar(str);
        Console.WriteLine(" The length of the smallest substring"
                + " consisting of maximum distinct "
                + "characters : "+len);
    }
}
 
// This code contributed by Rajput-Ji


PHP


Javascript


输出:

The length of the smallest substring consisting
 of maximum distinct characters : 5

方法二(高效)

  1. 计算给定字符串所有不同的字符。
  2. 维护一个字符窗口。每当窗口包含给定字符串 的所有字符时,我们从左侧缩小窗口以删除多余的字符,然后将其长度与迄今为止最小的窗口数量进行比较。

有关实现和更多详细信息,请参阅包含字符串本身所有字符的最小窗口。
询问: DailyHunt

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程