炒冷饭,面试题--N对括号组合与打印的Python代码

这是一个面试题,虽然我没有遇到过,但在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,方便起见&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值