输出n对括号的所有有效排列组合

问题:

输出n对括号所有有效的排列组合。比如三对括号,其有效的排列组合方式总共有5种:()()(),((())),(())(),()(()),(()())。

解决思路:

将一对括号编码为01,即左括号为0,右括号为1,那么n对括号的所有排列组合(不一定有效)就是n个0和n个1的全排列,全排列算法相对容易实现。假如我们已经得到了所有的全排列,那么接下来就是排除全排列中排列无效的形式。排除的方式也简单:从头遍历,遇到01挨着的就删除掉,直到整个字符串为空(有效),或不存在01组合(无效)。

代码:

全排列
def permutation(lst,beg):
    if beg>=len(lst):
        yield "".join([str(x) for x in lst])
        return
        
    for index in range(beg,len(lst)):
        lst[index],lst[beg]=lst[beg],lst[index]
        for val in permutation(lst,beg+1):
            yield val
        lst[index],lst[beg]=lst[beg],lst[index]
注:使用生成器是为了方便记录排列结果,
另:此时得到的全排列有重复的,可通过set来去重({}.fromkeys(lst).keys())

排列有效性检查
def chkstr(args):
    if len(args)==0:
        return True
    
    tmp=list(args)
    index=1
    while index < len(tmp):
        pre=tmp[index-1]
        pst=tmp[index]
        if pre=='0' and pst=='1':
            tmp[index-1]='-1'
            tmp[index]='-1'
            index=index+2
        else:
            index=index+1
    
    args="".join(tmp)
    
    if args.count('-1')==0:
        return False
    else:
        return chkstr(args.replace('-1', ''))

最后:

if __name__ == '__main__':
    lst=[]
    for val in permutation([0,0,0,1,1,1],0):
        t=chkstr(val)
        if t:
            lst.append(val)
    rst={}.fromkeys(lst).keys()
    for val in rst:
        print val


def brackets(left, right, bks):
    if left > right:
        return
    
    if right == 0:
        yield bks
    
    if 0 < left <= right:
        for val in brackets(left-1, right, bks+"("):
            yield val
    
    if right > max(left, 0):
        for val in brackets(left, right-1, bks+")"):
            yield val




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值