22. Generate Parentheses产生括号Python

给定n对括号,编写一个函数以生成格式正确的括号的所有组合。 

Input: n=3

Output: ["((()))","(()())","(())()","()(())","()()()"]

Method 1 迭代: 一共需要n个左括号和右括号,用迭代产生符合要求的括号

1. 定一个空的list用来存储结果,定义一个函数用来迭代,需要3个形参,一个用来存储每一次班组要求的括号,另外两个参数表示左右括号的个数。

{res=[]; dfs('',n,n); def dfs(s,l,r): }

2.先添加左括号,然后l-1;当表示可以添加的右括号的个数r大于l时添加右括号,r-1;当l和r都为0时证明括号添加完毕,将当前结果添加到res结果list中。

{if not r: res.append(s); if l: dfs(s+'(',l-1,r); if r>l: dfs(s+')',l,r-l)}

下面是以n=2为例的迭代流程

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        def dfs(s, l, r):
            if not r:
                res.append(s)
            if l:
                dfs(s+'(', l-1, r)
            if r > l:
                dfs(s+')', l, r-1)
        res = []
        dfs('', n, n)
        return res

时间复杂度O(4^n/(n^0.5)) 

Method 2 遍历所有可能的括号排序

Clue: 把所有可能的结果都遍历一遍,设置一个判断是否为有效括号的函数,然后如果有效添加到结果list中。和20题判断括号是否匹配不同的是,由于只有一种括号所以每当有一个左括号就+1,右括号就-1,如果结果为0则证明匹配。

class Solution(object):
    def generateParenthesis(self, n):
        def generate(c = []):
            if len(c) == 2*n:
                if valid(c):
                    res.append("".join(c))
            else:
                c.append('(')
                generate(c)
                c.pop()
                c.append(')')
                generate(c)
                c.pop()
        def valid(c):
            r = 0
            for _ in c:
                if _ == '(':
                    r += 1
                else:
                    r -= 1
                if r < 0:
                    return False
            return r == 0
        res=[]
        generate()
        return res

 时间复杂度O(2^(2n)n)因为有2的2n次方中排序方式,而判断是否有效括号则需要n次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值