Problem: 22. 括号生成
首先把左括号右括号都回溯一下,长度为n*2的加到列表中。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n <= 0: return []
res = []
def dfs(s):
if len(s) == n * 2: # 因为括号都是成对出现的
res.append(s)
dfs(s + '(')
dfs(s + ')')
dfs('')
return res
发现不符合条件的括号要么是 左括号大于n 要么是右括号数大于左括号数。
那结束搜索的条件首先就需要把不符合的给过滤掉,” ( “ 数量> n 或 ”) “数量 > n 或 ”)“ 数量 > ” (“数量
当然” )“ 数量 > n 这个条件已经 包含与 ”)“ 数量> ”(“数量 这个条件了。
需要通过引入left和right这两个参数记录回溯的时候”(“和”)“的数量,每回溯一次就将数量加1
def dfs(paths, left, right):
if left > n or right > left: return
if len(paths) == n * 2: # 因为括号都是成对出现的
res.append(paths)
dfs(s + '(', l + 1, r) # 生成一个就加一个
dfs(s + ')', l, r + 1)
['((()))', '(()())', '(())()', '()(())', '()()()']
代码
class Solution:
def generateParenthesis(self, n) :
if n <= 0: return []
res = []
def dfs(s, l, ri):
if l> n or r > l:
return
if len(s) == n * 2:
res.append(s)
dfs(s + '(', l + 1, r) # 生成一个就加一个
dfs(s + ')', l, r + 1)
dfs('', 0, 0)
return res