# Longest substring having K distinct vowels

• Difficulty Level : Hard
• Last Updated : 17 Aug, 2022

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

Note: Consider uppercase and lowercase characters as two different characters.

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 :
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 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 implementation of the above approach

## C++

 `// CPP program to find the longest substring``// with k distinct vowels.``#include ``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)) {` `                ``// decreasing 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;``}`

## Java

 `// Java program to find the longest substring``// with k distinct vowels.` `class` `GFG {` `    ``static` `int` `MAX = ``128``;` `    ``// Function to check whether a character is``    ``// vowel or not``    ``static` `boolean` `isVowel(``char` `x) {``        ``return` `(x == ``'a'` `|| x == ``'e'` `|| x == ``'i'` `||``                ``x == ``'o'` `|| x == ``'u'` `|| x == ``'A'` `||``                ``x == ``'E'` `|| x == ``'I'` `|| x == ``'O'` `||``                ``x == ``'U'``);``    ``}` `    ``static` `int` `KDistinctVowel(String s, ``int` `k) {``        ``// length of string``        ``int` `n = s.length();` `        ``// array for count of characters``        ``int``[] c = ``new` `int``[MAX];``        ``//Array.Clear(c, 0, c.Length);` `        ``// Initialize result to be``        ``// negative``        ``int` `result = -``1``;` `        ``for` `(``int` `i = ``0``, j = -``1``; i < n; ++i) {` `            ``char` `x = s.charAt(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.charAt(++j);``                ``if` `(isVowel(x)) {` `                    ``// decreasing 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 = Math.max(result, i - j);``            ``}``        ``}``        ``return` `result;``    ``}` `    ``// Driver code``    ``public` `static` `void` `main(String[] args) {``        ``String s = ``"tHeracEBetwEEntheTwo"``;``        ``int` `k = ``1``;``        ``System.out.println(KDistinctVowel(s, k));``    ``}``}` `/* This Java code is contributed by Rajput-Ji*/`

## Python3

 `# Python3 program to find the longest substring``# with k distinct vowels.` `MAX` `=` `128` `# Function to check whether a character is``# vowel or not``def` `isVowel(x):` `    ``return` `(x ``=``=` `'a'` `or` `x ``=``=` `'e'` `or` `x ``=``=` `'i'` `or``            ``x ``=``=` `'o'` `or` `x ``=``=` `'u'` `or` `x ``=``=` `'A'` `or``            ``x ``=``=` `'E'` `or` `x ``=``=` `'I'` `or` `x ``=``=` `'O'` `or``            ``x ``=``=` `'U'``)` `def` `KDistinctVowel(c,k):``    ``n ``=` `len``(s)` `    ``c ``=` `[``0` `for` `i ``in` `range``(``MAX``)]``    ``result ``=` `-``1` `    ``j ``=` `-``1` `    ``for` `i ``in` `range``(n):``        ``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):``            ``c[``ord``(x)] ``+``=` `1``            ``if` `c[``ord``(x)] ``=``=` `1``:``                ``k ``-``=` `1` `        ``# 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``:``            ``j ``+``=` `1``            ``x ``=` `s[j]``            ``if` `isVowel(x):``                ` `                ``# decreasing the count``                ``# so that it may appear``                ``# in another substring``                ``# appearing after this``                ``# present substring``                ``c[``ord``(x)] ``-``=` `1``                ``k ``+``=` `1``                ` `        ``# 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` `s ``=` `"tHeracEBetwEEntheTwo"``k ``=` `1``print``(KDistinctVowel(s, k))` `# This code is contributed by mohit kumar 29`

## C#

 `// C# program to find the longest substring``// with k distinct vowels.``using` `System;` `class` `GFG {``    ` `    ``static` `int` `MAX = 128;``    ` `    ``// Function to check whether a character is``    ``// vowel or not``    ``static` `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'``);``    ``}``    ` `    ``static` `int` `KDistinctVowel(``string` `s, ``int` `k)``    ``{``        ``// length of string``        ``int` `n = s.Length;``    ` `        ``// array for count of characters``        ``int` `[]c = ``new` `int``[MAX];``        ``Array.Clear(c, 0, c.Length);``    ` `        ``// Initialize result to be``        ``// negative``        ``int` `result = -1;``    ` `        ``for` `(``int` `i = 0, j = -1; i < n; ++i) {``    ` `            ``char` `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)) {``    ` `                    ``// decreasing 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 = Math.Max(result, i - j);``            ``}``        ``}``        ``return` `result;``    ``}``    ` `    ``// Driver code``    ``static` `void` `Main()``    ``{``        ``string` `s = ``"tHeracEBetwEEntheTwo"``;``        ``int` `k = 1;``        ``Console.Write(KDistinctVowel(s, k));``    ``}``}` `// This code is contributed Manish Shaw``// (manishshaw1)`

## PHP

 ``

## Javascript

 ``

Output

`7`

Complexity Analysis:

• Time Complexity: O(n)
• Auxiliary Space: O(1)

My Personal Notes arrow_drop_up