n=1
a e i o u
1 1 1 1 1
n=2
aa ae ai ao au 5
ee ei eo eu 4
ii io iu 3
oo ou 2
uu 1
n=3
15 10 6 3 1
从这里其实我们可以找到规律,n=2的时候a的值即为n=1时所有值的一个加和,而eiou则为其前一个字母当前n的值减去上一个n的值
即可分类讨论
class Solution {
public int countVowelStrings(int n) {
int sum=5;
//如果是0直接返回
if(n==0){
return 0;
}
int [][] dp=new int [5][n]; //5是aeiou n为题中所给,即每一个包含几个元素
//初始化,让为一个字母时都等于1
for(int i=0;i<5;i++){
dp[i][0]=1;
}
for(int i=1;i<n;i++){ //i是有几个字母 dp[i]是以某字母开头的有几个
for(int j=0;j<5;j++){//j是aeiou
if(j==0){
//a
dp[0][i]=sum;
sum=dp[0][i];
continue;
}
//其他
dp[j][i]=dp[j-1][i]-dp[j-1][i-1];
sum+=dp[j][i];
}
}
return sum;
}
}