这是一个面试题,虽然我没有遇到过,但在github上搜interview的时候发现了。想起自己曾经写过,但review的时候,发现写的太渣,于是重新写了一边。
基本思路:
0. N对括号,抽象一下,我们处理的基本单元是一个括号对,即'{}'这样一个整体,而不是单个的'{'或'}'。
1. 考虑 N = 0,1,2 直接对应 no brackets, '{}', ('{}{}', '{ {}}') 这样简单的结果,因此编写的程序直接考虑 N >= 3的情况。
2. 基于第0条,将一对括号抽象为一个节点,那么对于任意N(>=3)对括号,其所有的合法组合都可以用树和森林表示,例如,括号对-B和括号对-C在括号对-A内,那么B和C就是A的子节点,B和C互为兄弟节点。
3. 虽然树和森林可以转化为二叉树,但实际效果,这样的转化会使问题复杂化。
4. 如何表示一种树和森林,先序遍历树和森林,遍历时记录当前节点有多少个字节点,整体结果用一个list存储。例如对于 '{ { {}{}}{ {}{}}}' 可以描述为一个3层的完全二叉树,我们用list [2, 2, 0, 0, 2, 0, 0]来表示,并且实际上,最后一个节点肯定是没有子节点的,那么该list可以写为 [2, 2, 0, 0, 2, 0]。求出对于给定N,所有有效的list,即为所有有效的组合。5. 如何计算出/生成一个list,方便起见&