给定一个长度为 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
方法二(高效)
- 计算给定字符串所有不同的字符。
- 维护一个字符窗口。每当窗口包含给定字符串 的所有字符时,我们从左侧缩小窗口以删除多余的字符,然后将其长度与迄今为止最小的窗口数量进行比较。
有关实现和更多详细信息,请参阅包含字符串本身所有字符的最小窗口。
询问: DailyHunt
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。