<p>A <strong>substring</strong> is a contiguous (non-empty) sequence of characters within a string.</p>

<p>A <strong>vowel substring</strong> is a substring that <strong>only</strong> consists of vowels (<code>&#39;a&#39;</code>, <code>&#39;e&#39;</code>, <code>&#39;i&#39;</code>, <code>&#39;o&#39;</code>, and <code>&#39;u&#39;</code>) and has <strong>all five</strong> vowels present in it.</p>

<p>Given a string <code>word</code>, return <em>the number of <strong>vowel substrings</strong> in</em> <code>word</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> word = &quot;aeiouu&quot;
<strong>Output:</strong> 2
<strong>Explanation:</strong> The vowel substrings of word are as follows (underlined):
- &quot;<strong><u>aeiou</u></strong>u&quot;
- &quot;<strong><u>aeiouu</u></strong>&quot;
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> word = &quot;unicornarihan&quot;
<strong>Output:</strong> 0
<strong>Explanation:</strong> Not all 5 vowels are present, so there are no vowel substrings.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> word = &quot;cuaieuouac&quot;
<strong>Output:</strong> 7
<strong>Explanation:</strong> The vowel substrings of word are as follows (underlined):
- &quot;c<strong><u>uaieuo</u></strong>uac&quot;
- &quot;c<strong><u>uaieuou</u></strong>ac&quot;
- &quot;c<strong><u>uaieuoua</u></strong>c&quot;
- &quot;cu<strong><u>aieuo</u></strong>uac&quot;
- &quot;cu<strong><u>aieuou</u></strong>ac&quot;
- &quot;cu<strong><u>aieuoua</u></strong>c&quot;
- &quot;cua<strong><u>ieuoua</u></strong>c&quot;
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= word.length &lt;= 100</code></li>
	<li><code>word</code> consists of lowercase English letters only.</li>
</ul>

class Solution:
    def countVowelSubstrings(self, word: str) -> int:
        # Define the vowels we are interested in
        vowels = ('a', 'e', 'i', 'o', 'u')
        
        result = 0      # Initialize the result counter
        start = 0       # Initialize the start index for potential vowel substrings
        vowel_idx = {}  # Dictionary to store the latest index of each vowel

        # Iterate through each character in the word
        for idx, c in enumerate(word):
            if c in vowels:  # Check if the character is a vowel
                if not vowel_idx:  # If vowel_idx is empty, this is the start of a new vowel substring
                    start = idx  # Set the start index to the current index
                vowel_idx[c] = idx  # Update the dictionary with the current vowel and its index
                
                if len(vowel_idx) == 5:  # Check if all 5 vowels are present in the substring
                    # Add to result the number of valid substrings ending at the current index
                    result += min(vowel_idx.values()) - start + 1 
            elif vowel_idx:  # If the character is not a vowel and vowel_idx is not empty
                vowel_idx = {}  # Reset the dictionary for the next potential vowel substring

        return result  # Return the final count of vowel substrings

26