Count the number of vowels occurring in all the substrings of given string

Given a string of length N of lowercase characters containing 0 or more vowels, the task is to find the count of vowels occurred in all the substrings of the given string.

Examples:

Input: str = “abc”
Output: 3



The given string “abc” contains only one vowel = ‘a’
Substrings of “abc” are = {“a”, “b”, “c”, “ab”, “bc, “abc”}
Hence, the sum of occurrences of the vowel in these strings = 3.(‘a’ occurred 3 times)

Input: str = “daceh”
Output: 16

Naive Approach: Given a string of length N, the number of substrings that can be formed=N(N+1)/2. A simple solution is for each substring, we count the occurrences of the vowels and add them to get the result. The time complexity of this approach is O(N3) which is not suitable for large values of N.

Efficient Approach: The idea is to use a prefix sum array-based technique where we store the occurrences of each character in all the substrings concatenated.



  • For the first character,

    no. of occurrences = no. of substrings starting with the first character = N.

  • For each of the following characters, we store the

    no. of substrings starting with that character + the number of substrings formed by the previous characters containing this character the number of substrings formed by the previous characters only.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Returns the total sum of
// occurrences of all vowels
int vowel_calc(string s)
{
    int n = s.length();
    vector<int> arr;
  
    for (int i = 0; i < n; i++) {
  
        if (i == 0)
            // No. of occurrences of 0th character
            // in all the substrings
            arr.push_back(n);
  
        else
            // No. of occurrences of the ith character
            // in all the substrings
            arr.push_back((n - i) + arr[i - 1] - i);
    }
  
    int sum = 0;
    for (int i = 0; i < n; i++)
  
        // Check if ith character is a vowel
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i'
            || s[i] == 'o' || s[i] == 'u')
            sum += arr[i];
  
    // Return the total sum
    // of occurrences of vowels
    return sum;
}
  
// Driver code
int main()
{
    string s = "daceh";
    cout << vowel_calc(s) << endl;
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the above approach
  
import java.io.*;
import java.util.*;
  
public class Gfg {
  
    // Returns the total sum of
    // occurrences of all vowels
    static int vowel_calc(String s)
    {
        int n = s.length();
        int arr[] = new int[n];
  
        for (int i = 0; i < n; i++) {
  
            if (i == 0)
                // No. of occurrences of 0th character
                // in all the substrings
                arr[i] = n;
  
            else
                // No. of occurrences of ith character
                // in all the substrings
                arr[i] = (n - i) + arr[i - 1] - i;
        }
  
        int sum = 0;
        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            // Check if ith character is a vowel
            if (ch == 'a' || ch == 'e' || ch == 'i'
                || ch == 'o' || ch == 'u')
                sum += arr[i];
        }
  
        // Return the total sum
        // of occurences of vowels
        return sum;
    }
  
    // Driver Code
    public static void main(String args[])
    {
        String s = "daceh";
        System.out.println(vowel_calc(s));
    }
}

chevron_right


Output:

16

Time Complexity: O(N)



My Personal Notes arrow_drop_up


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.



Improved By : SouravAChowdhury_97