【LeetCode-中等题】22. 括号生成

文章目录

题目

方法一:递归:

  1. 递归入口 空子结果集,左括号数目(初始为0),右括号数目(初始为0)

  2. 递归出口

    若左括号 大于n 或者 左括号数量大于右括号数量 不符合题目要求 结束递归剪枝

    若 左括号数目 和 右括号数目都等于n 说明符合条件 结束递归

  3. 递归方向

    dfsback(zre+'(',leftsum+1,rightsum);//左括号递归

    dfsback(zre+')',leftsum,rightsum+1);//右括号递归

java 复制代码
class Solution {
    List<String> res = new ArrayList<>(); // 结果集
    int n = 0;
    public List<String> generateParenthesis(int n) {
        this.n = n;
        String zre = "";//子结果集
        dfsback(zre,0,0);
        return res;
    }
    public void dfsback(String zre,int leftsum,int rightsum){// n=3
    // leftsum > n((((  不满足     leftsum < rightsum ((  )))不满足
        if(leftsum > n  || leftsum < rightsum ) return;  
         //若左括号 大于n  或者 左括号数量大于右括号数量  不符合题目要求 结束递归剪枝
        if(leftsum == n && rightsum == n ){
        //若 左括号数目 和 右括号数目都等于n 说明符合条件  结束递归
            res.add(zre);
            return;
        }
    
       dfsback(zre+'(',leftsum+1,rightsum);//左括号递归
       dfsback(zre+')',leftsum,rightsum+1);//右括号递归
    }
}

或者下面在递归过程中根据条件去递归,符合括号生成条件才递归

java 复制代码
// 全递归  根据括号数目在递归过程中剪枝
    List<String> res = new ArrayList<>(); // 结果集
    int n = 0;
    public List<String> generateParenthesis(int n) {
        this.n = n;
        String zre = "";//子结果集
        dfsback(zre,0,0);
        return res;
    }
    public void dfsback(String zre,int leftsum,int rightsum){
            if(leftsum == n && rightsum == n) {  //左右括号都达到了n  结束递归
                res.add(zre);
                return;
            }
            if(leftsum > n  || leftsum < rightsum ) return;//若左括号 大于n  或者 左括号数量大于右括号数量  不符合题目要求 结束递归剪枝

           if(leftsum == rightsum)  dfsback(zre+'(',leftsum+1,rightsum); //在左括号右括号相等的情况下 只能添加左括号
           if(leftsum > rightsum) {//在左括号大于右括号的情况下 两种括号都能添加
                  dfsback(zre+'(',leftsum+1,rightsum);//左括号递归
                  dfsback(zre+')',leftsum,rightsum+1);//右括号递归
           }
    }

参考视频:括号生成

方法二:递归+回溯

java 复制代码
// 递归+回溯
    List<String> res = new ArrayList<>(); // 结果集
    int n = 0;
    public List<String> generateParenthesis(int n) {
        StringBuffer str = new StringBuffer();
        this.n = n;
        // String zre = "";//子结果集
        dfsback(str,0,0);
        return res;
    }
    public void dfsback(StringBuffer zre,int leftsum,int rightsum){
            if(leftsum == n && rightsum == n) {  //左右括号都达到了n  结束递归
                res.add(zre.toString());
                return;
            }
            if(leftsum > n  || leftsum < rightsum ) return;//若左括号 大于n  或者 左括号数量大于右括号数量  不符合题目要求 结束递归剪枝
                  zre.append('(');
                  dfsback(zre,leftsum+1,rightsum);//左括号递归
                  zre.deleteCharAt(zre.length()-1);//回溯

                  zre.append(')');
                  dfsback(zre,leftsum,rightsum+1);//右括号递归
                  zre.deleteCharAt(zre.length()-1);//回溯
    }
相关推荐
一只鱼^_8 分钟前
牛客周赛 Round 105
数据结构·c++·算法·均值算法·逻辑回归·动态规划·启发式算法
是阿建吖!9 分钟前
【动态规划】斐波那契数列模型
算法·动态规划
啊阿狸不会拉杆38 分钟前
《算法导论》第 27 章 - 多线程算法
java·jvm·c++·算法·图论
火车叨位去194944 分钟前
力扣top100(day04-05)--堆
算法·leetcode·职场和发展
数据智能老司机44 分钟前
面向企业的图学习扩展——面向图的传统机器学习
算法·机器学习
类球状1 小时前
顺序表 —— OJ题
算法
Miraitowa_cheems2 小时前
LeetCode算法日记 - Day 11: 寻找峰值、山脉数组的峰顶索引
java·算法·leetcode
CoovallyAIHub2 小时前
方案 | 动车底部零部件检测实时流水线检测算法改进
深度学习·算法·计算机视觉
CoovallyAIHub2 小时前
方案 | 光伏清洁机器人系统详细技术实施方案
深度学习·算法·计算机视觉
lxmyzzs2 小时前
【图像算法 - 14】精准识别路面墙体裂缝:基于YOLO12与OpenCV的实例分割智能检测实战(附完整代码)
人工智能·opencv·算法·计算机视觉·裂缝检测·yolo12