我的解法:
感觉是类似于求一个公式,如果把以各个字母开头可能的数量列出来能发现一定规律,其中i,o,u的公式比较好推到,a,e的比较难推到直接公式,但是步长还是能求出来,之后直接求解即可
n=1 a1+e1+i1+o1+u1=5
n=2 a5+e4+i3+o2+u1=15
n=3 a15+e10+i6+o3+u1=35
n=4 a35+e20+i10+o4+u1=70
u(n)=1
o(n)=n
i(n)=i(n-1)+u(n-1)+o(n-1)
i(n)-i(n-1)=1+n-1=n ( n>=2)
i(n)=(1+n)*n/2
e(n)=e(n-1)+i(n-1)+u(n-1)+o(n-1)
e(n)-e(n-1)=n*(n-1)/2+n=n*(n+1)/2
e(n)=n*(n+1)/2+n+1
class Solution:
def countVowelStrings(self, n: int) -> int:
a=[5,15]
e=[1,4]
for t in range(2,n):
i=t+1
current_e=e[t-1]+i*(i+1)/2
current_a=a[t-1]+current_e+(1+i)*i/2+i+1
a.append(current_a)
e.append(current_e)
return int(a[n-1])
标准解法:
发现实际结果就是c(n+4,4)
对于题目要求长度为 n 的答案来说:
如果 a e i o u 的数目确定,排序方式是唯一的
这样问题就转化成,一个长为 n 的字符串,划分成 5 段,能划分多少种
由于每个元素都可能是 0 个,所以各个划分位置可以都在 n 的外面
C(n+4, 4)
class Solution:
def countVowelStrings(self, n: int) -> int:
return comb(n + 4, 4)