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+')')
class Solution {
    List<String>res=new ArrayList<>();
    
    public List<String> generateParenthesis(int n) {
        dfs(n,n,"");
        return res;
    }

    public void dfs(int left,int right,String path){
        if(left==0 && right==0){
            res.add(path);
            return;
        }
        if(left>0){
            dfs(left-1,right,path+"(");
        }
        if(left<right){
            dfs(left,right-1,path+")");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值