力扣——1641. 统计字典序元音字符串的数目

文章目录

  • 题目描述
  • 隔板法原理
  • 题目作答

题目描述

给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按字典序排列的字符串数量。

字符串 s 按 字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i+1] 相同或在 s[i+1] 之前。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-sorted-vowel-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

抽象成数学问题是:给定元素种类数(5),待排列位数(n),排列规则(字典顺序)。求排列组合种类数。

先给出几组解以便于验算:
n=1------5
2------15
3------35
4------70
5------126

隔板法原理

开始学隔板法是用来处理n个无差别的球放进k个不同的盒子的问题。
应用隔板法的条件为:

  1. n个球是相同的
  2. k个盒子是互异的
  3. 每个盒子至少分得一个元素
    因为有n个球所以便有n-1个可以放板子的地方,共有k个板子要放,最总结果种数为: C n − 1 k C ^k _{n-1} Cn1k

发现题目不满足条件3,所以我们可以为每个盒子预先放入一个球即填元素隔板法。
可以理解为先有n+k个球,按隔板法放进k个盒子中,那么就会存在某个或某几个盒子里面只存放1个球的情况,之后我们从每一个盒子中拿出一个球,共拿出K个。那么此时剩余球的情况就等价于只放k个球且允许盒子为空的情况。

题目作答

对于本题,只需将n位当做n个完全相同的小球,将5个字母当成5个盒子即可。最终转化为在n+5 - 1个空位中插入4个隔板,将小球分为5堆。
所以该题目的解为 C n + 4 4 C ^4 _{n+4} Cn+44

那不使用填元素隔板法可以吗?当然可以,不过那样就需要进行分类讨论,即:

  1. 4个盒子为空: C 5 4 × 1 C ^4 _5 \times 1 C54×1。先选出4个空盒子再把剩余球放进不为空的那个盒子。(n>=1)
  2. 3个盒子为空: C 5 3 × C n − 1 1 C ^3 _5 \times C ^1_{n-1} C53×Cn11。同样先选出3个空盒子,之后将剩余球分为两堆,即插入一个隔板。(n>=2)
  3. 2个盒子为空: C 5 2 × C n − 1 2 C ^2 _5 \times C ^2_{n-1} C52×Cn12。(n>=3)
  4. 1个盒子为空: C 5 1 × C n − 1 3 C ^1 _5 \times C ^3_{n-1} C51×Cn13。(n>=4)
  5. 0个盒子为空: C n − 1 4 C ^4_{n-1} Cn14。(n>=5)

之后将所有种类加起来,就得到最终结果,化简为 1 24 × ( n 4 + 10 n 3 + 35 n 2 + 50 n + 24 ) \frac{1}{24} \times (n^4+10n^3+35n^2+50n+24) 241×(n4+10n3+35n2+50n+24)。与 C n + 4 4 C ^4 _{n+4} Cn+44得到结果相同。
不过为了严谨,这种做法需要分别把n=1,2,3,4,5代入到公式中,验证是否满足公式。

写成程序如下:

class Solution {
public:
    int countVowelStrings(int n) {
        return (n + 4) * (n + 3) * (n + 2) * (n + 1) / 24;
    }
};

你可能感兴趣的:(#,力扣经验分享,leetcode,算法,职场和发展)