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

回溯法就是学不会2 —— 括号生成问题

题目描述: 给定括号数量, 判断其能生成的合法括号组合
示例
括号数量 : n = 2
输出结果: [(()), ()()]

为什么可以用回溯法
本题解空间可以用树来表示, 在所有解的基础上去掉不合法结果(即剪枝),因此可以用回溯法解决

以 n = 2 为例, 本题的解空间树如下图所示
解空间树

得到所有解:

输出结果为: [((((, (((), (()(, (()), ()((, ()(), ())(, ())), )(((, )((), )()(, )()), ))((, ))(), )))(, ))))]

	// n为括号数量, path为临时字符串, result存储结果
    public void dfs(int n, String path, List<String> result){
    	// 字符串长度为2倍的n时,结束
        if(path.length() == 2*n){
            result.add(path);
            return;
        }
		// 加入左括号
        dfs(n, path + "(", result);
        // 加入右括号
        dfs(n, path + ")", result);
    }

剪枝:

方法: 引入开闭括号数量指针,open / close

  1. open或close数量大于 n, 剪枝——不合法,开闭括号数量超过最大数量
  2. close 数量大于 open , 剪枝 —— 不合法,有闭括号到开括号之前

加入剪枝函数后最终代码:

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

	// open,close分别表示开闭括号数量指针
    public void dfs(int n, String path, List<String> result, int open, int close){
    	// 剪枝判断语句
        if(open > n || close > open){
            return;
        }
        if(path.length() == 2*n){
            result.add(path);
            return;
        }
        dfs(n, path + "(" ,  result, open+1, close);
        dfs(n, path + ")",  result, open, close+1);
    }
}

最后感谢老师提供的思路,谢谢您!!!

相关文章:

  • ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL演示
  • 信息论学习笔记(二):离散无噪声系统
  • CentOS7启动SSH服务报错
  • 大咖说*计算讲谈社|商用车智能驾驶商业化实践
  • python笔记Ⅶ--函数返回值、作用域与命名空间、递归
  • 03 RocketMQ - Broker 源码分析
  • Java日志系列——规范化日志
  • 00前言说明-Qt自定义控件大全
  • 简历内容整理
  • 金仓数据库KingbaseES客户端编程接口指南-ado.net(7. Kdbnpg支持的类型和类型映射)
  • CTCLoss原理解读
  • 数字孪生|数字孪生装备-概念与内涵
  • 图像相似度对比分析软件,图像相似度算法有哪些
  • 《深入理解JAVA虚拟机(第2版)》—— 学习笔记2
  • 高并发面试:线程池的七大参数?手写一个线程池?
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • extract-text-webpack-plugin用法
  • Mysql5.6主从复制
  • MySQL-事务管理(基础)
  • Node项目之评分系统(二)- 数据库设计
  • npx命令介绍
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue.js框架原理浅析
  • Vue--数据传输
  • 计算机在识别图像时“看到”了什么?
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 探索 JS 中的模块化
  • Spring Batch JSON 支持
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #1014 : Trie树
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (70min)字节暑假实习二面(已挂)
  • (二)fiber的基本认识
  • (二)斐波那契Fabonacci函数
  • (接口自动化)Python3操作MySQL数据库
  • (九)One-Wire总线-DS18B20
  • (区间dp) (经典例题) 石子合并
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .htaccess配置常用技巧
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET CLR基本术语
  • .Net mvc总结
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .Net中间语言BeforeFieldInit
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ACTF2020 新生赛]Include
  • [android] 天气app布局练习
  • [C++] sqlite3_get_table 的使用
  • [Docker]六.Docker自动部署nodejs以及golang项目
  • [DP 训练] Longest Run on a Snowboard, UVa 10285
  • [element-ui] el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器