问题
有
n 个左括号和
n 个右括号,将它们进行匹配,即每个左括号都有对应的右括号。求每个
n 有多少匹配方式。
下表是
n=1∼5 的排列方式和答案。
| n | 合法组合 | 数量 |
|---|
| 0 | * | 1 |
| 1 | () | 1 |
| 2 | (()),()() | 2 |
| 3 | ()()(),()(()),(())(),(()()),((())) | 5 |
| 4 | 14种组合 | 14 |
| 5 | 42种组合 | 42 |
通项公式
记
Cn 为
n 对括号匹配的方案数。
括号串可以表示为:
允许
A 或
B 的括号串长度为
0。
A 是左括号与右括号之间的平衡子串,包含
k 对括号。
B 是右边剩余的平衡子串,包含
n−k−1 对括号。
由此可以得到递推公式:
Cn=k=0∑n−1Ck×Cn−k−1
也可以用组合数表示:
Cn=n+11(n2n)
简单证明:
所有长度为
2n 的合法序列,总数为
(n2n),非法序列总数为
(n−12n)
Cn=(n2n)−(n−12n)=n!n!(2n)!−(n−1)!(n+1)!(2n)!=(2n)!(n!n!1−(n−1)!(n+1)!1)=(2n)!((n!)21−nn!(n+1)n!1)=(2n)!((n!)21−(n+1)(n!)2n)=(2n)!(n!)21(1−n+1n)=(2n)!(n!)21⋅n+11=n+11(n2n)
即:
Cn=n+11(n2n)
证毕。
相关题目
现有一个操作数序列
1,2,⋯,n,另有一个栈
A 。
现在可以进行两种操作:
-
将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的
push 操作)
-
将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的
pop 操作)
对于给定的
n,求由操作数序列
1,2,⋯,n 经过操作可能得到的输出序列的总数。
卡特兰数解答
Cn=n+11(n2n)
我们可以推导出
Cn 与
Cn−1 的递推关系:
Cn=n+11(n2n)=(n+1)n!n!(2n)!Cn−1=n1(n−12(n−1))=n(n−1)!(n−1)!(2n−2)!
那么:
Cn−1Cn=n(n−1)!(n−1)!(2n−2)!(n+1)n!n!(2n)!=(2n−2)!(2n)!⋅n+1n⋅n!2(n−1)!2=n2(2n)(2n−1)⋅n+1n=n+12(2n−1)
所以:
Cn=n+12(2n−1)Cn−1