# dfs的遍历
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n <= 0: return [] # 特例判断
res = [] #设置返回列表
def dfs(paths, left, right): #构造dfs函数进行遍历
if left > n or right > left or right >n: return #出循环条件
if len(paths) == n * 2: # 因为括号都是成对出现的
res.append(paths)
return
dfs(paths + '(', left + 1, right) # 生成一个就加一个
dfs(paths + ')', left, right + 1)
dfs('', 0, 0)
return res
总结一下本道回溯算法题:
首先明确限制条件,n对括号那么最多n个'(',n个')',且要成为成对的括号
因此需要满足俩个条件,插入数量不超过n,插入右括号的前提是左括号更多
设置俩个变量path-保存走过的路径和res-返回最后的结果
进行初始化dfs('',0,0)
#动态规划
#思路:如果有一组,则为'()',那n组拆分后为'('+p+')'+q,其中p+q+1==n,p与q呈线性关系
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n==0:return []
tl = []
tl.append([None])# 0组括号记为None
tl.append(['()'])# 1组括号记为'()'
for i in range(2,n+1): # p组数目范围为(2,n),列表左闭右开
t = [] # 设置空列表记录括号情况
for j in range(i): #q组数目范围为(0,p-1)
l1 = tl[j]# p=j的括号情况
l2 = tl[i-1-j] # q=i-1-p的括号情况
for k1 in l1: # 遍历l1和l2的情况
for k2 in l2:
if k1 == None:
k1 = ""
if k2 == None:
k2 = ""
el = "(" + k1 + ")" + k2
t.append(el) # 把所有可能的情况添加到 t 中
tl.append(t) # t这个list就是i组括号的所有情况,添加到tl中,继续求解i=i+1的情况
return tl[n]