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

## Recommended Posts:

- Longest substring of vowels
- Encrypt string with product of number of vowels and consonants in substring of size k
- Longest Ordered Subsequence of Vowels
- Length of longest common subsequence containing vowels
- Longest Palindromic Substring | Set 1
- Longest Common Substring | DP-29
- Longest Palindromic Substring | Set 2
- Longest Non-palindromic substring
- Longest substring with count of 1s more than 0s
- Longest repeating and non-overlapping substring
- Length of the longest valid substring
- Print the longest common substring
- Longest Even Length Substring such that Sum of First and Second Half is same
- Length of the longest substring with equal 1s and 0s
- Longest Common Substring in an Array of Strings

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.