Count of substrings containing exactly K distinct vowels
Given string str of size N containing both uppercase and lowercase letters, and an integer K. The task is to find the count of substrings containing exactly K distinct vowels.
Examples:
Input: str = “aeiou”, K = 2
Output: 4
Explanation: The substrings having two distinct vowels are “ae”, “ei”, “io” and “ou”.
Input: str = “TrueGoik”, K = 3
Output: 5
Explanation: The substrings are “TrueGo”, “rueGo”, “ueGo”, “eGoi” and “eGoik”.
Approach: The problem can be solved by generating all the substrings. From the generated substrings count the ones having K distinct vowels. Follow the steps mentioned below to implement the approach:
- First generate all substrings starting from each index i in range [0, N]
- Then for each substring, follow the steps:
- Keep a hash array to store the occurrences of unique vowels.
- Check if a new character in the substring is a vowel or not.
- If it is a vowel, increment its occurrence in the hash and keep a count of distinct vowels found
- Now for each substring, if the distinct count of vowels is K, increment the final count.
- If for any loop to find substrings starting from i, the count of distinct vowels exceeds K, or, the substring length has reached string length, break the loop and look for substrings starting from i+1.
- When all the substrings have been considered, print the final count.
Below is 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 getIndex( char ch)
{
return (ch - 'A' > 26 ? ch - 'a' :
ch - 'A' );
}
int countkDist(string str, int k)
{
int n = str.length();
int res = 0;
for ( int i = 0; i < n; i++) {
int dist_count = 0;
vector< int > cnt(26, 0);
for ( int j = i; j < n; j++) {
if (isVowel(str[j])
&& cnt[getIndex(str[j])]
== 0)
dist_count++;
cnt[getIndex(str[j])]++;
if (dist_count == k)
res++;
if (dist_count > k)
break ;
}
}
return res;
}
int main()
{
string str = "TrueGoik" ;
int K = 3;
cout << countkDist(str, K) << endl;
return 0;
}
|
Java
import java.util.*;
public class GFG
{
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 getIndex( char ch)
{
return (ch - 'A' > 26 ? ch - 'a' :
ch - 'A' );
}
static int countkDist(String str, int k)
{
int n = str.length();
int res = 0 ;
for ( int i = 0 ; i < n; i++) {
int dist_count = 0 ;
int cnt[] = new int [ 26 ];
for ( int t = 0 ; t < 26 ; t++) {
cnt[t] = 0 ;
}
for ( int j = i; j < n; j++) {
if (isVowel(str.charAt(j))
&& cnt[getIndex(str.charAt(j))]
== 0 )
dist_count++;
cnt[getIndex(str.charAt(j))]++;
if (dist_count == k)
res++;
if (dist_count > k)
break ;
}
}
return res;
}
public static void main(String args[])
{
String str = "TrueGoik" ;
int K = 3 ;
System.out.println(countkDist(str, K));
}
}
|
Python3
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 getIndex(ch):
return ( ord (ch) - ord ( 'a' )) if ( ord (ch) - ord ( 'A' )) > 26 else ( ord (ch) - ord ( 'A' ))
def countkDist( str , k):
n = len ( str )
res = 0
for i in range (n):
dist_count = 0
cnt = [ 0 ] * 26
for j in range (i, n):
if (isVowel( str [j]) and cnt[getIndex( str [j])] = = 0 ):
dist_count + = 1
cnt[getIndex( str [j])] + = 1
if (dist_count = = k):
res + = 1
if (dist_count > k):
break
return res
s = "TrueGoik"
K = 3
print (countkDist(s, K))
|
C#
using System;
class GFG
{
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 getIndex( char ch)
{
return (ch - 'A' > 26 ? ch - 'a' :
ch - 'A' );
}
static int countkDist( string str, int k)
{
int n = str.Length;
int res = 0;
for ( int i = 0; i < n; i++) {
int dist_count = 0;
int []cnt = new int [26];
for ( int t = 0; t < 26; t++) {
cnt[t] = 0;
}
for ( int j = i; j < n; j++) {
if (isVowel(str[j])
&& cnt[getIndex(str[j])]
== 0)
dist_count++;
cnt[getIndex(str[j])]++;
if (dist_count == k)
res++;
if (dist_count > k)
break ;
}
}
return res;
}
public static void Main()
{
string str = "TrueGoik" ;
int K = 3;
Console.Write(countkDist(str, K));
}
}
|
Javascript
<script>
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 getIndex(ch) {
return ((ch.charCodeAt(0) - 'A' .charCodeAt(0)) > 26 ? (ch.charCodeAt(0) - 'a' .charCodeAt(0)) :
(ch.charCodeAt(0) - 'A' .charCodeAt(0)));
}
function countkDist(str, k)
{
let n = str.length;
let res = 0;
for (let i = 0; i < n; i++) {
let dist_count = 0;
let cnt = new Array(26).fill(0)
for (let j = i; j < n; j++) {
if (isVowel(str[j])
&& cnt[getIndex(str[j])]
== 0)
dist_count++;
cnt[getIndex(str[j])]++;
if (dist_count == k)
res++;
if (dist_count > k)
break ;
}
}
return res;
}
let s = "TrueGoik" ;
let K = 3
document.write(countkDist(s, K));
</script>
|
Time Complexity: O(N2)
Auxiliary Space: O(N2)
Last Updated :
29 Dec, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...