# Queries to find the count of vowels in the substrings of the given string

Given a string str of length N and Q queries where every query consists of two integers L and R. For every query, the task is to find the count of vowels in the substring str[L…R].

Examples:

Input: str = “geeksforgeeks”, q[][] = {{1, 3}, {2, 4}, {1, 9}}
Output:
2
1
4
Query 1: “eek” has 2 vowels.
Query 2: “eks” has 1 vowel.
Query 3: “eeksforge” has 2 vowels.

Input: str = “aaaa”, q[][] = {{1, 3}, {1, 4}}
Output:
3
3

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Naive approach: For every query, traverse the string from Lth character to the Rth character and find the count of vowels.

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach ` `#include ` `using` `namespace` `std; ` `#define N 2 ` ` `  `// Function that returns true ` `// if ch is a vowel ` `bool` `isVowel(``char` `ch) ` `{ ` ` `  `    ``return` `(ch == ``'a'` `|| ch == ``'e'` `            ``|| ch == ``'i'` `|| ch == ``'o'` `            ``|| ch == ``'u'``); ` `} ` ` `  `// Function to return the count of vowels ` `// in the substring str[l...r] ` `int` `countVowels(string str, ``int` `l, ``int` `r) ` `{ ` ` `  `    ``// To store the count of vowels ` `    ``int` `cnt = 0; ` ` `  `    ``// For every character in ` `    ``// the index range [l, r] ` `    ``for` `(``int` `i = l; i <= r; i++) { ` ` `  `        ``// If the current character ` `        ``// is a vowel ` `        ``if` `(isVowel(str[i])) ` `            ``cnt++; ` `    ``} ` `    ``return` `cnt; ` `} ` ` `  `void` `performQueries(string str, ``int` `queries[][N], ``int` `q) ` `{ ` ` `  `    ``// For every query ` `    ``for` `(``int` `i = 0; i < q; i++) { ` ` `  `        ``// Find the count of vowels ` `        ``// for the current query ` `        ``cout << countVowels(str, queries[i], ` `                            ``queries[i]) << ``"\n"``; ` `    ``} ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``string str = ``"geeksforgeeks"``; ` `    ``int` `queries[][N] = { { 1, 3 }, { 2, 4 }, { 1, 9 } }; ` `    ``int` `q = (``sizeof``(queries) ` `             ``/ ``sizeof``(queries)); ` ` `  `    ``performQueries(str, queries, q); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java implementation of the approach ` `class` `GFG ` `{ ` `static` `int` `N = ``2``; ` ` `  `// Function that returns true ` `// if ch is a vowel ` `static` `boolean` `isVowel(``char` `ch) ` `{ ` ` `  `    ``return` `(ch == ``'a'` `|| ch == ``'e'` `||  ` `            ``ch == ``'i'` `|| ch == ``'o'` `||  ` `            ``ch == ``'u'``); ` `} ` ` `  `// Function to return the count of vowels ` `// in the substring str[l...r] ` `static` `int` `countVowels(String str,  ` `                       ``int` `l, ``int` `r) ` `{ ` ` `  `    ``// To store the count of vowels ` `    ``int` `cnt = ``0``; ` ` `  `    ``// For every character in ` `    ``// the index range [l, r] ` `    ``for` `(``int` `i = l; i <= r; i++) ` `    ``{ ` ` `  `        ``// If the current character ` `        ``// is a vowel ` `        ``if` `(isVowel(str.charAt(i))) ` `            ``cnt++; ` `    ``} ` `    ``return` `cnt; ` `} ` ` `  `static` `void` `performQueries(String str,  ` `                           ``int` `queries[][],  ` `                           ``int` `q) ` `{ ` ` `  `    ``// For every query ` `    ``for` `(``int` `i = ``0``; i < q; i++)  ` `    ``{ ` ` `  `        ``// Find the count of vowels ` `        ``// for the current query ` `        ``System.out.println(countVowels(str, queries[i][``0``], ` `                                            ``queries[i][``1``])); ` `    ``} ` `} ` ` `  `// Driver code ` `public` `static` `void` `main(String[] args)  ` `{ ` `    ``String str = ``"geeksforgeeks"``; ` `    ``int` `queries[][] = { { ``1``, ``3` `}, { ``2``, ``4` `},  ` `                                  ``{ ``1``, ``9` `} }; ` `    ``int` `q = queries.length; ` ` `  `    ``performQueries(str, queries, q); ` `} ` `} ` ` `  `// This code is contributed by PrinciRaj1992 `

## Python3

 `# Python3 implementation of the approach  ` `N ``=` `2``;  ` ` `  `# Function that returns true  ` `# if ch is a vowel  ` `def` `isVowel(ch) :  ` ` `  `    ``return` `(ch ``=``=` `'a'` `or` `ch ``=``=` `'e'` `or`  `            ``ch ``=``=` `'i'` `or` `ch ``=``=` `'o'` `or` `            ``ch ``=``=` `'u'``);  ` ` `  `# Function to return the count of vowels  ` `# in the substring str[l...r]  ` `def` `countVowels(string, l, r) : ` ` `  `    ``# To store the count of vowels  ` `    ``cnt ``=` `0``;  ` ` `  `    ``# For every character in  ` `    ``# the index range [l, r]  ` `    ``for` `i ``in` `range``(l, r ``+` `1``) : ` ` `  `        ``# If the current character  ` `        ``# is a vowel  ` `        ``if` `(isVowel(string[i])) : ` `            ``cnt ``+``=` `1``;  ` ` `  `    ``return` `cnt;  ` ` `  `def` `performQueries(string, queries, q) : ` ` `  `    ``# For every query  ` `    ``for` `i ``in` `range``(q) : ` ` `  `        ``# Find the count of vowels  ` `        ``# for the current query  ` `        ``print``(countVowels(string, queries[i][``0``],  ` `                                  ``queries[i][``1``]));  ` ` `  `# Driver code  ` `if` `__name__ ``=``=` `"__main__"` `:  ` ` `  `    ``string ``=` `"geeksforgeeks"``;  ` `    ``queries ``=` `[ [ ``1``, ``3` `], ` `                ``[ ``2``, ``4` `],  ` `                ``[ ``1``, ``9` `] ];  ` `    ``q ``=` `len``(queries)  ` ` `  `    ``performQueries(string, queries, q);  ` ` `  `# This code is contributed by AnkitRai01 `

## C#

 `// C# implementation of the approach ` `using` `System; ` ` `  `class` `GFG ` `{ ` `static` `int` `N = 2; ` ` `  `// Function that returns true ` `// if ch is a vowel ` `static` `Boolean isVowel(``char` `ch) ` `{ ` ` `  `    ``return` `(ch == ``'a'` `|| ch == ``'e'` `||  ` `            ``ch == ``'i'` `|| ch == ``'o'` `||  ` `            ``ch == ``'u'``); ` `} ` ` `  `// Function to return the count of vowels ` `// in the substring str[l...r] ` `static` `int` `countVowels(String str,  ` `                       ``int` `l, ``int` `r) ` `{ ` ` `  `    ``// To store the count of vowels ` `    ``int` `cnt = 0; ` ` `  `    ``// For every character in ` `    ``// the index range [l, r] ` `    ``for` `(``int` `i = l; i <= r; i++) ` `    ``{ ` ` `  `        ``// If the current character ` `        ``// is a vowel ` `        ``if` `(isVowel(str[i])) ` `            ``cnt++; ` `    ``} ` `    ``return` `cnt; ` `} ` ` `  `static` `void` `performQueries(String str,  ` `                           ``int` `[,]queries,  ` `                           ``int` `q) ` `{ ` ` `  `    ``// For every query ` `    ``for` `(``int` `i = 0; i < q; i++)  ` `    ``{ ` ` `  `        ``// Find the count of vowels ` `        ``// for the current query ` `        ``Console.WriteLine(countVowels(str, queries[i, 0], ` `                                           ``queries[i, 1])); ` `    ``} ` `} ` ` `  `// Driver code ` `public` `static` `void` `Main(String[] args)  ` `{ ` `    ``String str = ``"geeksforgeeks"``; ` `    ``int` `[,]queries = { { 1, 3 }, { 2, 4 },  ` `                                 ``{ 1, 9 } }; ` `    ``int` `q = queries.GetLength(0); ` ` `  `    ``performQueries(str, queries, q); ` `} ` `} ` ` `  `// This code is contributed by Rajput-Ji `

Output:

```2
1
4
```

Time Complexity: O(N * Q) where N is the length of string and Q is the number of queries.

Efficient approach: Create a prefix array pre[] where pre[i] will store the count vowels in the substring str[0…i]. Now, the count of vowels in the range [L, R] can be easily calculated in O(1) as pre[R] – pre[L – 1].

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach ` `#include ` `using` `namespace` `std; ` `#define N 2 ` ` `  `// Function that returns true ` `// if ch is a vowel ` `bool` `isVowel(``char` `ch) ` `{ ` ` `  `    ``return` `(ch == ``'a'` `|| ch == ``'e'` `            ``|| ch == ``'i'` `|| ch == ``'o'` `            ``|| ch == ``'u'``); ` `} ` ` `  `void` `performQueries(string str, ``int` `len, ` `                    ``int` `queries[][N], ``int` `q) ` `{ ` ` `  `    ``// pre[i] will store the count of ` `    ``// vowels in the substring str[0...i] ` `    ``int` `pre[len]; ` ` `  `    ``if` `(isVowel(str)) ` `        ``pre = 1; ` `    ``else` `        ``pre = 0; ` ` `  `    ``// Fill the pre[] array ` `    ``for` `(``int` `i = 1; i < len; i++) { ` ` `  `        ``// If current character is a vowel ` `        ``if` `(isVowel(str[i])) ` `            ``pre[i] = 1 + pre[i - 1]; ` ` `  `        ``// If its a consonant ` `        ``else` `            ``pre[i] = pre[i - 1]; ` `    ``} ` ` `  `    ``// For every query ` `    ``for` `(``int` `i = 0; i < q; i++) { ` ` `  `        ``// Find the count of vowels ` `        ``// for the current query ` `        ``if` `(queries[i] == 0) { ` `            ``cout << pre[queries[i]] << ``"\n"``; ` `        ``} ` `        ``else` `{ ` `            ``cout << (pre[queries[i]] ` `                     ``- pre[queries[i] - 1]) ` `                 ``<< ``"\n"``; ` `        ``} ` `    ``} ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``string str = ``"geeksforgeeks"``; ` `    ``int` `len = str.length(); ` `    ``int` `queries[][N] = { { 1, 3 }, { 2, 4 }, { 1, 9 } }; ` `    ``int` `q = (``sizeof``(queries) ` `             ``/ ``sizeof``(queries)); ` ` `  `    ``performQueries(str, len, queries, q); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java implementation of the approach ` `class` `GFG ` `{ ` `static` `final` `int` `N = ``2``; ` ` `  `// Function that returns true ` `// if ch is a vowel ` `static` `Boolean isVowel(``char` `ch) ` `{ ` ` `  `    ``return` `(ch == ``'a'` `|| ch == ``'e'` `||  ` `            ``ch == ``'i'` `|| ch == ``'o'` `|| ` `            ``ch == ``'u'``); ` `} ` ` `  `static` `void` `performQueries(String str, ``int` `len, ` `                      ``int` `queries[][], ``int` `q) ` `{ ` ` `  `    ``// pre[i] will store the count of ` `    ``// vowels in the subString str[0...i] ` `    ``int` `[]pre = ``new` `int``[len]; ` ` `  `    ``if` `(isVowel(str.charAt(``0``))) ` `        ``pre[``0``] = ``1``; ` `    ``else` `        ``pre[``0``] = ``0``; ` ` `  `    ``// Fill the pre[] array ` `    ``for` `(``int` `i = ``1``; i < len; i++)  ` `    ``{ ` ` `  `        ``// If current character is a vowel ` `        ``if` `(isVowel(str.charAt(i))) ` `            ``pre[i] = ``1` `+ pre[i - ``1``]; ` ` `  `        ``// If its a consonant ` `        ``else` `            ``pre[i] = pre[i - ``1``]; ` `    ``} ` ` `  `    ``// For every query ` `    ``for` `(``int` `i = ``0``; i < q; i++)  ` `    ``{ ` ` `  `        ``// Find the count of vowels ` `        ``// for the current query ` `        ``if` `(queries[i][``0``] == ``0``)  ` `        ``{ ` `            ``System.out.println(pre[queries[i][``1``]]); ` `        ``} ` `        ``else`  `        ``{ ` `            ``System.out.println((pre[queries[i][``1``]] -  ` `                                ``pre[queries[i][``0``] - ``1``])); ` `        ``} ` `    ``} ` `} ` ` `  `// Driver code ` `public` `static` `void` `main(String[] args) ` `{ ` `    ``String str = ``"geeksforgeeks"``; ` `    ``int` `len = str.length(); ` `    ``int` `queries[][] = { { ``1``, ``3` `},  ` `                        ``{ ``2``, ``4` `}, { ``1``, ``9` `} }; ` `    ``int` `q = queries.length; ` ` `  `    ``performQueries(str, len, queries, q); ` `} ` `} ` ` `  `// This code is contributed by Rajput-Ji `

## C#

 `// C# implementation of the approach ` `using` `System; ` `using` `System.Collections.Generic; ` ` `  `class` `GFG ` `{ ` `static` `readonly` `int` `N = 2; ` ` `  `// Function that returns true ` `// if ch is a vowel ` `static` `Boolean isVowel(``char` `ch) ` `{ ` ` `  `    ``return` `(ch == ``'a'` `|| ch == ``'e'` `||  ` `            ``ch == ``'i'` `|| ch == ``'o'` `|| ` `            ``ch == ``'u'``); ` `} ` ` `  `static` `void` `performQueries(String str, ``int` `len, ` `                       ``int` `[,]queries, ``int` `q) ` `{ ` ` `  `    ``// pre[i] will store the count of ` `    ``// vowels in the subString str[0...i] ` `    ``int` `[]pre = ``new` `int``[len]; ` ` `  `    ``if` `(isVowel(str)) ` `        ``pre = 1; ` `    ``else` `        ``pre = 0; ` ` `  `    ``// Fill the pre[] array ` `    ``for` `(``int` `i = 1; i < len; i++)  ` `    ``{ ` ` `  `        ``// If current character is a vowel ` `        ``if` `(isVowel(str[i])) ` `            ``pre[i] = 1 + pre[i - 1]; ` ` `  `        ``// If its a consonant ` `        ``else` `            ``pre[i] = pre[i - 1]; ` `    ``} ` ` `  `    ``// For every query ` `    ``for` `(``int` `i = 0; i < q; i++)  ` `    ``{ ` ` `  `        ``// Find the count of vowels ` `        ``// for the current query ` `        ``if` `(queries[i, 0] == 0)  ` `        ``{ ` `            ``Console.WriteLine(pre[queries[i, 1]]); ` `        ``} ` `        ``else` `        ``{ ` `            ``Console.WriteLine((pre[queries[i, 1]] -  ` `                               ``pre[queries[i, 0] - 1])); ` `        ``} ` `    ``} ` `} ` ` `  `// Driver code ` `public` `static` `void` `Main(String[] args) ` `{ ` `    ``String str = ``"geeksforgeeks"``; ` `    ``int` `len = str.Length; ` `    ``int` `[,]queries = { { 1, 3 },  ` `                       ``{ 2, 4 }, { 1, 9 } }; ` `    ``int` `q = queries.GetLength(0); ` ` `  `    ``performQueries(str, len, queries, q); ` `} ` `} ` ` `  `// This code is contributed by Rajput-Ji `

Output:

```2
1
4
```

Time Complexity: O(N) for pre-computation and O(1) every query.

My Personal Notes arrow_drop_up Developer

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.

Article Tags :
Practice Tags :

2

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.