思路一:递归/动态规划
考虑 i=n 时相比 n-1 组括号增加的那一组括号的位置。
"(" + 【i=p时所有括号的排列组合】 + ")" + 【i=q时所有括号的排列组合】
p + q = n-1,且 p q 均为非负整数。
当上述 p 从 0 取到 n-1,q 从 n-1 取到 0 后,所有情况就遍历完了。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n==0:
return []
total=[[] for _ in range(n+1)]
total[0]=[""]
for i in range(1,n+1):#第i组括号的组合情况
for j in range (i):#i组括号左右分割
list1=total[j]#左边
list2=total[i-1-j]#右边
for k1 in list1:#k1是j组括号排列组合的情况
for k2 in list2:
total[i].append("({0}){1}".format(k1, k2))
return total[n]
思路二:回溯/递归
其中左分支都是添加左括号,右分支都是添加右括号。
- 添加左括号:左括号个数小于n时,在path里添加左括号,然后left-1
- 添加右括号:当左括号个数大于右括号的个数时,添加右括号。
- 满足两个条件的任意一个就可以继续向下搜索,而不是同时只能满足其中的一个。所以代码后面的判断条件都是 if,而不是 elif
使用两个变量: res 和 path,res 表示最终的结果,path 保存已经走过的路径。如果搜到一个状态满足题目要求(左右都为0了),就把 path 放到 res 中。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
res=[]
self.dfs(res,n,n,'')
return res
def dfs(self,res,left,right,path):
if left==0 and right==0:
res.append(path)
return
if left>0:
self.dfs(res,left-1,right,path+'(')
if left<right:
self.dfs(res,left,right-1,path+')')