1220. Count Vowels Permutation

Problem


Tags: Dynamic Programming

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

Code

CPP

// 1220. Count Vowels Permutation (1/16/53479)
// Runtime: 64 ms (45.36%) Memory: 27.28 MB (21.80%) 

class Solution {
public:
  int countVowelPermutation(int n) {
    constexpr int kMod = 1e9 + 7;
    vector<vector<long>> dp(n + 1, vector<long>(5));
    fill(begin(dp[1]), end(dp[1]), 1);
    // 0: a, 1: e, 2: i, 3: o, 4: u
    for (int i = 2; i <= n; ++i) {
      dp[i][1] += dp[i - 1][0]; // a -> e
      
      dp[i][0] += dp[i - 1][1]; // e -> a
      dp[i][2] += dp[i - 1][1]; // e -> i
      
      for (int j = 0; j < 5; ++j) {
        if (j == 2) continue;
        dp[i][j] += dp[i - 1][2]; // i -> *
      }
      
      dp[i][2] += dp[i - 1][3]; // o -> i
      dp[i][4] += dp[i - 1][3]; // o -> u
      
      dp[i][0] += dp[i - 1][4]; // u -> a
      
      for (int j = 0; j < 5; ++j)
        dp[i][j] %= kMod;
    }
    return accumulate(begin(dp[n]), end(dp[n]), 0L) % kMod;
  }
};