Count of K length substring containing at most X distinct vowels - GeeksforGeeks

12 Jan, 2022
Given string str of size N containing both uppercase and lowercase letters, and two integers K and X. The task is to find the count of substrings of size K containing at most X distinct vowels.
Examples:
Input: str = “TrueGoik”, K = 3, X = 2Output: 6Explanation: The five such substrings are “Tru”, “rue”, “ueG”, “eGo”, “Goi” and”oik”.
Input: str = “GeeksForGeeks”, K = 2, X = 2Output: 12Explanation: “Ge”, “ee”, “ek”, “ks”, “sf”, “fo”, “or”, “rG”, “Ge”, “ee”, “ek” and “ks”.
Approach: To solve the problem, first one have to generate all the substrings of length K. Then in each substring check if number of distinct vowels is less than X or not. Follow the steps mentioned below.
First generate all substrings of length K starting from each index i in [0, N – K].
Then for each substring of length K, do the following:Keep a hash 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 foundNow for each substring, if the distinct count of vowels is less than or equal to X, increment the final count.
Keep a hash 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 less than or equal to X, increment the final count.
When all the substrings have been considered, print the final count.
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ code to implement above approach#include <bits/stdc++.h>using namespace std; #define MAX 128 // Function to check whether// a character is vowel or notbool 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');} // Function to find the count of K length// substring with at most x distinct vowelsint get(string str, int k, int x){    int n = str.length();     // Initialize result    int res = 0;     // Consider all substrings    // beginning with str[i]    for (int i = 0; i <= n - k; i++) {        int dist_count = 0;         // To store count of characters        // from 'a' to 'z'        vector<int> cnt(26, 0);         // Consider all substrings        // between str[i..j]        for (int j = i; j < i + k; j++) {             // If this is a new vowels            // for this substring,            // increment dist_count.            if (isVowel(str[j])                && cnt[getIndex(str[j])]                == 0) {                dist_count++;            }             // Increment count of            // current character            cnt[getIndex(str[j])]++;        }         // If count of distinct vowels        // in current substring        // of length k is less than        // equal to x, then increment result.        if (dist_count <= x)            res++;    }     return res;} // Driver codeint main(void){    string s = "TrueGoik";    int K = 3, X = 2;    cout << get(s, K, X);    return 0;}
// Java code to implement above approachimport java.util.Arrays; 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 getIndex(char ch) {    return (ch - 'A' > 26 ? ch - 'a' : ch - 'A');  }   // Function to find the count of K length  // substring with at most x distinct vowels  static int get(String str, int k, int x) {    int n = str.length();     // Initialize result    int res = 0;     // Consider all substrings    // beginning with str[i]    for (int i = 0; i <= n - k; i++) {      int dist_count = 0;       // To store count of characters      // from 'a' to 'z'      int[] cnt = new int[26];      Arrays.fill(cnt, 0);       // Consider all substrings      // between str[i..j]      for (int j = i; j < i + k; j++) {         // If this is a new vowels        // for this substring,        // increment dist_count.        if (isVowel(str.charAt(j))            && cnt[getIndex(str.charAt(j))] == 0) {          dist_count++;        }         // Increment count of        // current character        cnt[getIndex(str.charAt(j))]++;      }       // If count of distinct vowels      // in current substring      // of length k is less than      // equal to x, then increment result.      if (dist_count <= x)        res++;    }     return res;  }   // Driver code  public static void main(String args[]) {    String s = "TrueGoik";    int K = 3, X = 2;    System.out.println(get(s, K, X));  }} // This code is contributed by saurabh_jaiswal.
# Python code for the above approach # Function to check whether# a character is vowel or notdef 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')) # Function to find the count of K length# substring with at most x distinct vowelsdef get(str, k, x):    n = len(str)     # Initialize result    res = 0     # Consider all substrings    # beginning with str[i]    for i in range(n - k + 1):        dist_count = 0         # To store count of characters        # from 'a' to 'z'        cnt = [0] * 26         # Consider all substrings        # between str[i..j]        for j in range(i, i + k):             # If this is a new vowels            # for this substring,            # increment dist_count.            if (isVowel(str[j]) and cnt[getIndex(str[j])] == 0):                dist_count += 1             # Increment count of            # current character            cnt[getIndex(str[j])] += 1         # If count of distinct vowels        # in current substring        # of length k is less than        # equal to x, then increment result.        if (dist_count <= x):            res += 1     return res # Driver code s = "TrueGoik"K = 3X = 2print(get(s, K, X)) # This code is contributed by Saurabh Jaiswal
// C# code to implement above approachusing System;class GFG {   // 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 getIndex(char ch)  {    return (ch - 'A' > 26 ? ch - 'a' : ch - 'A');  }   // Function to find the count of K length  // substring with at most x distinct vowels  static int get(string str, int k, int x)  {    int n = str.Length;     // Initialize result    int res = 0;     // Consider all substrings    // beginning with str[i]    for (int i = 0; i <= n - k; i++) {      int dist_count = 0;       // To store count of characters      // from 'a' to 'z'      int[] cnt = new int[26];      // Arrays.fill(cnt, 0);       // Consider all substrings      // between str[i..j]      for (int j = i; j < i + k; j++) {         // If this is a new vowels        // for this substring,        // increment dist_count.        if (isVowel(str[j])            && cnt[getIndex(str[j])] == 0) {          dist_count++;        }         // Increment count of        // current character        cnt[getIndex(str[j])]++;      }       // If count of distinct vowels      // in current substring      // of length k is less than      // equal to x, then increment result.      if (dist_count <= x)        res++;    }     return res;  }   // Driver code  public static void Main()  {    string s = "TrueGoik";    int K = 3, X = 2;    Console.WriteLine(get(s, K, X));  }} // This code is contributed by ukasp.
<script>      // JavaScript code for the above approach       // Function to check whether      // a character is vowel or not      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 to find the count of K length      // substring with at most x distinct vowels      function get(str, k, x) {          let n = str.length;           // Initialize result          let res = 0;           // Consider all substrings          // beginning with str[i]          for (let i = 0; i <= n - k; i++) {              let dist_count = 0;               // To store count of characters              // from 'a' to 'z'              let cnt = new Array(26).fill(0);               // Consider all substrings              // between str[i..j]              for (let j = i; j < i + k; j++) {                   // If this is a new vowels                  // for this substring,                  // increment dist_count.                  if (isVowel(str[j])                      && cnt[getIndex(str[j])]                      == 0) {                      dist_count++;                  }                   // Increment count of                  // current character                  cnt[getIndex(str[j])]++;              }               // If count of distinct vowels              // in current substring              // of length k is less than              // equal to x, then increment result.              if (dist_count <= x)                  res++;          }           return res;      }       // Driver code       let s = "TrueGoik";      let K = 3, X = 2;      document.write(get(s, K, X)); // This code is contributed by Potta Lokesh  </script>
  
6
Time Complexity: O(N * K)Auxiliary Space: O(N * K)
 
lokeshpotta20
gfgking
_saurabh_jaiswal
ukasp
adnanirshad158
Algo-Geek 2021
substring
Algo Geek
Hash
Mathematical
Strings
Hash
Strings
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximize partitions that if sorted individually makes the whole Array sorted
Find sum of factorials till N factorial (1! + 2! + 3! + ... + N!)
Generate string after adding spaces at specific positions in a given String
Day-Stout-Warren algorithm to balance given Binary Search Tree
Create a balanced BST using vector in C++ STL
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Internal Working of HashMap in Java
Count pairs with given sum
Hashing | Set 1 (Introduction)
Hashing | Set 3 (Open Addressing)