Topics are as follows:
Given an integer
n
, your task is to count how many strings of lengthn
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: 68Constraints:
1 <= n <= 2 * 10^4
Problem-solving ideas: the method of dynamic programming, referred DP [i] [j] is the number of strings can be composed in the case of the i-th position of the j-th place of vowels, it is easy to obtain a state transition equation. For example, if the i-th element is the 'e', then the first i-1 elements can only be 'a' or 'i', there dp [i] [ 'e' ] = dp [i-1] [ 'a '] + dp [i-1 ] [' i '], and finally only the n-th element is determined to put the number of the five vowels and can.
code show as below:
class Solution(object): def countVowelPermutation(self, n): """ :type n: int :rtype: int """ dp = [[0] * 5 for _ in range(n)] vowels = ['a', 'e', 'i', 'o', 'u'] dp[0][0] = dp[0][1] =dp[0][2] =dp[0][3] = dp[0][4] = 1 for i in range(1,len(dp)): for j in range(len(vowels)): if vowels[j] == 'a': dp[i][j] += dp[i - 1][vowels.index('e')] dp[i][j] += dp[i - 1][vowels.index('u')] dp[i][j] += dp[i - 1][vowels.index('i')] elif vowels[j] == 'e': dp[i][j] += dp[i - 1][vowels.index('a')] dp[i][j] += dp[i - 1][vowels.index('i')] elif vowels[j] == 'i': dp[i][j] += dp[i - 1][vowels.index('e')] dp[i][j] += dp[i - 1][vowels.index('o')] elif vowels[j] == 'o': dp[i][j] += dp[i - 1][vowels.index('i')] elif vowels[j] == 'u': dp[i][j] += dp[i - 1][vowels.index('i')] dp[i][j] += dp[i - 1][vowels.index('o')] return sum(dp[-1]) % (10**9 + 7)