文章目录
leetcode之动态规划系列算法
1.统计元音字母序列的数目
1.1动态规划
func countVowelPermutation(n int) int {
const mod int=1e9+7
var a int
dp :=[5]int{1,1,1,1,1}
for i :=1;i<n ;i++{
dp =[5]int{
(dp[1]+dp[2]+dp[4])%mod,
( dp[0]+dp[2])%mod,
(dp[1]+dp[3])%mod,
dp[2]%mod,
(dp[2]+dp[3])%mod, //这必须加一个逗号,否则会报错
}
}
for _, v :=range dp{
a=a+v
}
return a%mod
}
// a e i o u
// 0 1 2 3 4
// 题目中给定的字符的下一个字符的规则如下:
// 字符串中的每个字符都应当是小写元音字母 (‘a’,‘e’,‘i’,‘o’,‘u’);
//每个元音 ‘a’ 后面都只能跟着 ‘e’;
//每个元音 ‘e’ 后面只能跟着 ‘a’ 或者是 ‘i’;
//每个元音 ‘i’ 后面不能再跟着另一个 ‘i’;
//每个元音 ‘o’ 后面只能跟着 ‘i’ 或者是 ‘u’;
//每个元音 ‘u’ 后面只能跟着 ‘a’;
//以上等价于每个字符的前一个字符的规则如下:
//
//元音字母 ‘a’ 前面只能跟着 ‘e’,‘i’,‘u’;
//元音字母 ‘e’ 前面只能跟着 ‘a’,‘i’;
//每个元音 ‘i’ 前面只能跟着 ‘e’,‘o’; ei eo
//每个元音 ‘o’ 前面只能跟着 ‘i’;
//每个元音 ‘u’ 后面只能跟着 ‘o’,‘i’; uo ui
/*
n=1, dp=[1,1,1,1,1]
n=2, dp=[3,2,2,1,2]
n=3 dp=[6,5,3,2,3]*/
//注意:进行for循环里的dp操作时,不会按顺序依次对dp数组进行赋值,而是一次性对dp里面所有的数组的值进行赋值