1332. Count Vowels Permutation

  • Difficulty: Hard

  • Topics: Dynamic Programming

  • Similar Questions:

Problem:

Given an integer n, your task is to count how many strings of length n can be formed under the following rules:

  • Each character is a lower case vowel ('a', 'e', 'i', 'o', 'u')
  • Each vowel 'a' may only be followed by an 'e'.
  • Each vowel 'e' may only be followed by an 'a' or an 'i'.
  • Each vowel 'i' may not be followed by another 'i'.
  • Each vowel 'o' may only be followed by an 'i' or a 'u'.
  • Each vowel 'u' may only be followed by an 'a'.

Since the answer may be too large, return it modulo 10^9 + 7.

 

Example 1:

Input: n = 1
Output: 5
Explanation: All possible strings are: "a", "e", "i" , "o" and "u".

Example 2:

Input: n = 2
Output: 10
Explanation: All possible strings are: "ae", "ea", "ei", "ia", "ie", "io", "iu", "oi", "ou" and "ua".

Example 3: 

Input: n = 5
Output: 68

 

Constraints:

  • 1 <= n <= 2 * 10^4

Solutions:

class Solution {
public:
    int countVowelPermutation(int n) {
        if (n == 0) return 1;
        if (n == 1) return 5;

        vector<unordered_map<char, int>> dp(n);

        dp[0] = {
            {'a', 1},
            {'e', 1},
            {'i', 1},
            {'o', 1},
            {'u', 1}
        };

        for (int i = 1; i < n; ++i) {
            unordered_map<char, int> charToCount;
            for (auto& entry : dp[i-1]) {
                char c = entry.first;
                int count = entry.second;
                for (auto& follower : followers[c]) {
                    charToCount[follower] = (charToCount[follower] + count) % MOD;
                }
            }

            dp[i] = charToCount;
        }

        int ret = 0;
        for (auto& entry : dp[n-1]) {
            ret = (ret + entry.second) % MOD;
        }

        return ret;

    }

private:
    const int MOD = 1e9 + 7;
    unordered_map<char, vector<char>> followers {
        {'a', {'e'}},
        {'e', {'a', 'i'}},
        {'i', {'a', 'e', 'o', 'u'}},
        {'o', {'i', 'u'}},
        {'u', {'a'}}
    };

};

results matching ""

    No results matching ""