1220. Count Vowels Permutation
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
From: LeetCode
Link: 1220. Count Vowels Permutation
Solution:
Ideas:
keep counts of strings ending with each vowel, then update by reverse rules.
Code:
c
int countVowelPermutation(int n) {
const long MOD = 1000000007;
long a = 1, e = 1, i = 1, o = 1, u = 1;
for (int len = 2; len <= n; len++) {
long na = (e + i + u) % MOD; // previous e/i/u can go to a
long ne = (a + i) % MOD; // previous a/i can go to e
long ni = (e + o) % MOD; // previous e/o can go to i
long no = i % MOD; // previous i can go to o
long nu = (i + o) % MOD; // previous i/o can go to u
a = na;
e = ne;
i = ni;
o = no;
u = nu;
}
return (int)((a + e + i + o + u) % MOD);
}