# 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`

``````class Solution {
public:
int countVowelPermutation(int n) {
int res = 0, M = 1e9 + 7;
vector<char> vowels{'a', 'e', 'i', 'o', 'u'};
vector<vector<long>> dp(n, vector<long>(5));
for (int j = 0; j < 5; ++j) dp[0][j] = 1;
for (int i = 1; i < n; ++i) {
dp[i][0] = (dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][4]) % M;
dp[i][1] = (dp[i - 1][0] + dp[i - 1][2]) % M;
dp[i][2] = (dp[i - 1][1] + dp[i - 1][3]) % M;
dp[i][3] = dp[i - 1][2];
dp[i][4] = (dp[i - 1][2] + dp[i - 1][3]) % M;
}
for (int j = 0; j < 5; ++j) {
res = (res + dp[n - 1][j]) % M;
}
return res;
}
};
``````

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1220

https://leetcode.com/problems/count-vowels-permutation/

https://leetcode.com/problems/count-vowels-permutation/discuss/398222/Detailed-Explanation-using-Graphs-With-Pictures-O(n)

https://leetcode.com/problems/count-vowels-permutation/discuss/398173/C%2B%2B-Bottom-up-Recursive-DPs-O(n)-and-Matrix-Exponentiation-O(logn)

LeetCode All in One 题目讲解汇总(持续更新中…)

 微信打赏 Venmo 打赏
（欢迎加入博主的知识星球，博主将及时答疑解惑，并分享刷题经验与总结，试运营期间前五十位可享受半价优惠～）

×

Help us with donation