Longest substring having K distinct vowels

Given a string s we have to find the length of the longest substring of s which contain exactly K distinct vowels.

Examples:

Input : s = “tHeracEBetwEEntheTwo”, k = 1
Output : 14
Explanation : Longest substring with only 1 vowel is “cEBetwEEntheTw”
and its length is 14.

Input : s = “artyebui”, k = 2
Output : 6
Explanation : Longest substring with only 2 vowel is “rtyebu”

Brute-Force Approach : For each substring, we check for the criteria for K distinct vowel and check the length. Finally, the largest length will be the result.

Efficient Approach : Here we maintain the count of vowels occurring in the substring. Till K is not zero, we count the distinct vowel occurring in the substring. As K becomes negative, we start deleting the first vowel of the substring we have found till that time, so that it may be possible that new substring( larger length ) is possible afterward. As we delete the vowel we decrease its count so that in new substring may contain that vowel occurring in the later part of the string. And as K is 0 we get the length of the substring.

Below is the C++ implementation of the above approach
[sourcecode language=”CPP”]
// CPP program to find the longest substring
// with k distinct vowels.
#include <bits/stdc++.h>
using namespace std;

#define MAX 128

// Function to check whether a character is
// vowel or not
bool isVowel(char x)
{
return (x == ‘a’ || x == ‘e’ || x == ‘i’ ||
x == ‘o’ || x == ‘u’ || x == ‘A’ ||
x == ‘E’ || x == ‘I’ || x == ‘O’ ||
x == ‘U’);
}

int KDistinctVowel(char s[], int k)
{
// length of string
int n = strlen(s);

// array for count of characters
int c[MAX];
memset(c, 0, sizeof(c));

// Initialize result to be
// negative
int result = -1;

for (int i = 0, j = -1; i < n; ++i) {

int x = s[i];

// If letter is vowel then we
// increment its count value
// and decrease the k value so
// that if we again encounter the
// same vowel character then we
// don’t consider it for our result
if (isVowel(x)) {
if (++c[x] == 1) {

// Decrementing the K value
–k;
}
}

// Till k is 0 above if condition run
// after that this while loop condition
// also become active. Here what we have
// done actually is that, if K is less
// than 0 then we eliminate the first
// vowel we have encountered till that
// time . Now K is incremented and k
// becomes 0. So, now we calculate the
// length of substring from the present
// index to the deleted index of vowel
// which result in our results.
while (k < 0) {

x = s[++j];
if (isVowel(x)) {

// decresing the count
// so that it may appear
// in another substring
// appearing after this
// present substring
if (–c[x] == 0) {

// incrementing the K value
++k;
}
}
}

// Checking the maximum value
// of the result by comparing
// the length of substring
// whenever K value is 0 means
// K distinct vowel is present
// in substring
if (k == 0)
result = max(result, i – j);
}
return result;
}

// Driver code
int main(void)
{
char s[] = "tHeracEBetwEEntheTwo";
int k = 1;
cout << KDistinctVowel(s, k);
return 0;
}
[/sourcecode]

Output:

14


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.