Each vowel can only follow certain other vowels, so we can use dynamic programming to count the number of valid strings ending with each vowel at each position. By updating the counts for each vowel according to the rules, we build up the answer for length n.
classSolution {
public:int countVowelPermutation(int n) {
constint MOD =1e9+7;
long a=1, e=1, i=1, o=1, u=1;
for (int k=2; k<=n; ++k) {
long na = (e+i+u)%MOD;
long ne = (a+i)%MOD;
long ni = (e+o)%MOD;
long no = i%MOD;
long nu = (i+o)%MOD;
a=na; e=ne; i=ni; o=no; u=nu;
}
return (a+e+i+o+u)%MOD;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
funccountVowelPermutation(nint) int {
constMOD = 1e9+7a, e, i, o, u:=1, 1, 1, 1, 1fork:=2; k<=n; k++ {
na:= (e+i+u) %MODne:= (a+i) %MODni:= (e+o) %MODno:=i%MODnu:= (i+o) %MODa, e, i, o, u = na, ne, ni, no, nu }
return (a+e+i+o+u) %MOD}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution {
publicintcountVowelPermutation(int n) {
int MOD = 1000000007;
long a=1, e=1, i=1, o=1, u=1;
for (int k=2; k<=n; ++k) {
long na = (e+i+u)%MOD;
long ne = (a+i)%MOD;
long ni = (e+o)%MOD;
long no = i%MOD;
long nu = (i+o)%MOD;
a=na; e=ne; i=ni; o=no; u=nu;
}
return (int)((a+e+i+o+u)%MOD);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution {
funcountVowelPermutation(n: Int): Int {
val MOD = 1000000007var a=1L; var e=1L; var i=1L; var o=1L; var u=1Lfor (k in2..n) {
val na = (e+i+u)%MOD
val ne = (a+i)%MOD
val ni = (e+o)%MOD
val no = i%MOD
val nu = (i+o)%MOD
a=na; e=ne; i=ni; o=no; u=nu
}
return ((a+e+i+o+u)%MOD).toInt()
}
}
1
2
3
4
5
6
7
8
9
10
11
defcountVowelPermutation(n: int) -> int:
MOD =10**9+7 a, e, i, o, u =1, 1, 1, 1, 1for _ in range(2, n+1):
na = (e + i + u) % MOD
ne = (a + i) % MOD
ni = (e + o) % MOD
no = i % MOD
nu = (i + o) % MOD
a, e, i, o, u = na, ne, ni, no, nu
return (a + e + i + o + u) % MOD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
impl Solution {
pubfncount_vowel_permutation(n: i32) -> i32 {
let m =1_000_000_007;
let (mut a, mut e, mut i, mut o, mut u) = (1, 1, 1, 1, 1);
for _ in2..=n {
let na = (e + i + u) % m;
let ne = (a + i) % m;
let ni = (e + o) % m;
let no = i % m;
let nu = (i + o) % m;
a = na; e = ne; i = ni; o = no; u = nu;
}
(a + e + i + o + u) % m
}
}