Longest substring having K distinct vowels
Last Updated :
26 Feb, 2023
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 : 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.
Time Complexity: O(N^2)
Space Complexity: O(1)
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++
#include <bits/stdc++.h>
using namespace std;
#define MAX 128
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)
{
int n = strlen (s);
int c[MAX];
memset (c, 0, sizeof (c));
int result = -1;
for ( int i = 0, j = -1; i < n; ++i) {
int x = s[i];
if (isVowel(x)) {
if (++c[x] == 1) {
--k;
}
}
while (k < 0) {
x = s[++j];
if (isVowel(x)) {
if (--c[x] == 0) {
++k;
}
}
}
if (k == 0)
result = max(result, i - j);
}
return result;
}
int main( void )
{
char s[] = "tHeracEBetwEEntheTwo" ;
int k = 1;
cout << KDistinctVowel(s, k);
return 0;
}
|
Java
class GFG {
static int MAX = 128 ;
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) {
int n = s.length();
int [] c = new int [MAX];
int result = - 1 ;
for ( int i = 0 , j = - 1 ; i < n; ++i) {
char x = s.charAt(i);
if (isVowel(x)) {
if (++c[x] == 1 ) {
--k;
}
}
while (k < 0 ) {
x = s.charAt(++j);
if (isVowel(x)) {
if (--c[x] == 0 ) {
++k;
}
}
}
if (k == 0 ) {
result = Math.max(result, i - j);
}
}
return result;
}
public static void main(String[] args) {
String s = "tHeracEBetwEEntheTwo" ;
int k = 1 ;
System.out.println(KDistinctVowel(s, k));
}
}
|
Python3
MAX = 128
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 isVowel(x):
c[ ord (x)] + = 1
if c[ ord (x)] = = 1 :
k - = 1
while k < 0 :
j + = 1
x = s[j]
if isVowel(x):
c[ ord (x)] - = 1
k + = 1
if k = = 0 :
result = max (result, i - j)
return result
s = "tHeracEBetwEEntheTwo"
k = 1
print (KDistinctVowel(s, k))
|
C#
using System;
class GFG {
static int MAX = 128;
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)
{
int n = s.Length;
int []c = new int [MAX];
Array.Clear(c, 0, c.Length);
int result = -1;
for ( int i = 0, j = -1; i < n; ++i) {
char x = s[i];
if (isVowel(x)) {
if (++c[x] == 1) {
--k;
}
}
while (k < 0) {
x = s[++j];
if (isVowel(x)) {
if (--c[x] == 0) {
++k;
}
}
}
if (k == 0) {
result = Math.Max(result, i - j);
}
}
return result;
}
static void Main()
{
string s = "tHeracEBetwEEntheTwo" ;
int k = 1;
Console.Write(KDistinctVowel(s, k));
}
}
|
PHP
<?php
$MAX = 128;
function isVowel( $x )
{
return ( $x == 'a' || $x == 'e' || $x == 'i' ||
$x == 'o' || $x == 'u' || $x == 'A' ||
$x == 'E' || $x == 'I' || $x == 'O' ||
$x == 'U' );
}
function KDistinctVowel( $s , $k )
{
global $MAX ;
$n = strlen ( $s );
$c = array_fill (0, $MAX , NULL);
$result = -1;
for ( $i = 0, $j = -1; $i < $n ; ++ $i )
{
$x = $s [ $i ];
if (isVowel( $x ))
{
if (++ $c [ord( $x )] == 1)
{
-- $k ;
}
}
while ( $k < 0)
{
$x = $s [++ $j ];
if (isVowel( $x ))
{
if (-- $c [ord( $x )] == 0)
{
++ $k ;
}
}
}
if ( $k == 0)
$result = max( $result , $i - $j );
}
return $result ;
}
$s = "tHeracEBetwEEntheTwo" ;
$k = 1;
echo KDistinctVowel( $s , $k );
?>
|
Javascript
<script>
let MAX = 128;
function isVowel(x)
{
return (x == 'a' || x == 'e' || x == 'i' ||
x == 'o' || x == 'u' || x == 'A' ||
x == 'E' || x == 'I' || x == 'O' ||
x == 'U' );
}
function KDistinctVowel(s,k)
{
let n = s.length;
let c = new Array(MAX);
for (let i=0;i<c.length;i++)
{
c[i]=0;
}
let result = -1;
for (let i = 0, j = -1; i < n; ++i) {
let x = s[i];
if (isVowel(x)) {
if (++c[x.charCodeAt(0)] == 1) {
--k;
}
}
while (k < 0) {
x = s[++j];
if (isVowel(x)) {
if (--c[x.charCodeAt(0)] == 0) {
++k;
}
}
}
if (k == 0) {
result = Math.max(result, i - j);
}
}
return result;
}
let s = "tHeracEBetwEEntheTwo" ;
let k = 1;
document.write(KDistinctVowel(s, k));
</script>
|
Complexity Analysis:
- Time Complexity: O(n)
- Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...