当前位置: 首页 > article >正文

【Leetcode 热题 100】22. 括号生成

问题背景

数字 n n n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
数据约束

  • 1 ≤ n ≤ 8 1 \le n \le 8 1n8

解题过程

这题有一个不是很明显的需要理解的点,处理的过程中是先搞定左括号,再解决右括号的。
在这个前提下,生成的字符串是不可能出现括号不匹配(同一组括号先开再闭)的情况的,只要严格约束两种括号的数量,其它都可以交给递归来完成。

具体实现

选左括号还是右括号(不选左括号)

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        char[] path = new char[2 * n];
        dfs(0, 0, n, path, res);
        return res;
    }

    private void dfs(int i, int leftCount, int n, char[] path, List<String> res) {
        // 递归边界是产生的字符串达到符合要求的长度
        if(i == 2 * n) {
            res.add(new String(path));
            return;
        }
        // 如果左括号的数量尚未达到要求,那就再填一个并进一步递归
        if(leftCount < n) {
            path[i] = '(';
            dfs(i + 1, leftCount + 1, n, path, res);
        }
        // 如果右括号的数量小于左括号的数量,那就在当前位置上覆盖一个右括号,并进一步递归
        if(i - leftCount < leftCount) {
            path[i] = ')';
            dfs(i + 1, leftCount, n, path, res);
        }
    }
}

选择在哪一个位置上填左括号

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        dfs(0, 0, n, path, res);
        return res;
    }

    // i 表示当前已经填入的括号总数,diff 表示左括号比右括号多的数量
    private void dfs(int i, int diff, int n, List<Integer> path, List<String> res) {
        // 递归边界是产生的字符串达到符合要求的长度,在相应的位置上填上左括号并生成答案
        if(path.size() == n) {
            char[] chS = new char[2 * n];
            Arrays.fill(chS, ')');
            for(int item : path) {
                chS[item] = '(';
            }
            res.add(new String(chS));
            return;
        }
        // 枚举合理的右括号的数量
        for(int rightCount = 0; rightCount <= diff; rightCount++) {
            // 从已经完成匹配的右括号开始尝试,找出合理的左括号的位置
            path.add(i + rightCount);
            // 这一轮操作尝试填入了 1 个左括号,rightCount 个右括号
            dfs(i + rightCount + 1, diff - rightCount + 1, n, path, res);
            path.remove(path.size() - 1);
        }
    }
}

http://www.kler.cn/a/461537.html

相关文章:

  • Leetcode731. 我的日程安排表 II
  • 【深度学习进阶】基于CNN的猫狗图片分类项目
  • 设计模式 创建型 单例模式(Singleton Pattern)与 常见技术框架应用 解析
  • 朱姆沃尔特隐身战舰:从失败到威慑
  • parquet文件数据格式介绍以及python pandas对parquet常见操作
  • nature reviews genetics | 需要更多的针对不同种族的癌症基因组图谱研究,促进精准治疗和维护治疗公平权益
  • 设计模式-创建型模式-工厂模式
  • 【Git_bugs】remote error GH013 Repository rule violations found for.md
  • 【网络】什么是路由协议(Routing Protocols)?常见的路由协议包括RIP、OSPF、EIGRP和BGP
  • ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)
  • 随笔 | 写在2024的最后一天
  • 线程锁和协程锁的区别
  • Redis Stream:实时数据处理的高效解决方案
  • 2分钟知晓Vscode 插件发布流程
  • 【Rust自学】8.6. HashMap Pt.2:更新HashMap
  • 智能运维分析决策系统:构建高效运维的新篇章
  • 自动化与人工结合:如何平衡效率与风险?
  • 监控 Docker 注册表
  • 基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案
  • python-Flask:SQLite数据库路径不正确但是成功访问到了数据库,并对表进行了操作
  • QT----------常用界面组件的使用
  • 2024 AI产品经理在大模型的探索与实践(附学习资料下载)
  • 低空经济迅猛发展,无人机服务拔得头筹
  • 2021-04-14 输入一个数,判断奇偶性,若是奇数乘以2,若是偶数除2,得到结果若是三位数则反序,否则输出计算结果
  • Java 溯本求源之基础(三十三)——接口
  • 使用logrotate工具来管理和轮转日志文件