leetcode【中等】22、括号生成

在这里插入图片描述
思路一:递归/动态规划
考虑 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+')')

猜你喜欢

转载自blog.csdn.net/qq_40707462/article/details/112755074