合法括号的所有组合

给定一个n,问你所有n个合法括号的组合。
用递归,每一次选择左括号或后括号,选左括号的条件是左括号的数目小于n,选右括号的条件是右括号的数目小于左括号的数目,递归后记得还原现场,递归出口是右括号的数目等于n,把这个组合加入到答案列表里然后返回。
见鬼了,同样的思路和实现,用台式机做出来了,当时用笔记本电脑就做不对。:)



def dfs(num_left, num_right, sub_ans_str, ans_list, n):

    if num_right==n and num_left==n: # 或者只是 num_right==n, 因为当num_right==n时一定有num_left==n,因为设置了num_right<num_left的条件,进入dfs的时候num_righ永远只能是<=num_left
        ans_list.append(sub_ans_str[:])
        return

    # 选左边
    if num_left < n:
        sub_ans_str += "("
        dfs(num_left+1, num_right, sub_ans_str, ans_list, n)
        sub_ans_str = sub_ans_str[:-1]
    # 选右边
    if num_right < num_left:
        sub_ans_str += ")"
        dfs(num_left, num_right+1, sub_ans_str, ans_list, n)
        sub_ans_str = sub_ans_str[:-1]

    return

n = 3
num_left = 0
num_right = 0
sub_ans_str = ""
ans_list = []
dfs(num_left, num_right, sub_ans_str, ans_list, n)
print(ans_list)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值