给定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次