[leetcode] 22. 括号生成

news2024/11/28 22:49:18

文章目录

  • 题目描述
  • 解题方法
    • 方法一:dfs遍历
      • java代码
    • 方法二:按照卡特兰数的思路递归求出有效括号组合
      • java代码
  • 相似题目

题目描述

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

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

解题方法

方法一:dfs遍历

我说一下大体思路,我们设置dfs的左括号数为 l e f t left left,右括号数是 r i g h t right right n n n是括号对数, s t r str str是括号字符串, l i s t list list是匹配的结果集。初始时 l e f t left left r i g h t right right为0, s t r str str为空字符, l i s t list list集合为空。每次dfs时 s t r str str先匹配一个左括号,然后进入下一次dfs,等下一次dfs匹配完之后, s t r str str再匹配一个右括号,再进入下一次dfs。dfs的过程中可以通过剪枝去掉不匹配的括号组合,而当 s t r str str是有效的括号组合时,则将 s t r str str加入到 l i s t list list中,具体代码如下所示。

java代码

public List<String> generateParenthesis(int n) {
    List<String> result = new ArrayList<>();
    dfs(0, 0, n, "", result);
    return result;
}
//left左括号数,right右括号数,n是括号对数,str是括号字符串,list是匹配的结果集
public void dfs(int left, int right, int n, String str, List<String> list) {
    //右括号比左边的左括号多或者左括号超过了n个,则str字符串不是有效的括号组合
    if (right > left || left > n) {
        return;
    }
    //当左括号和右括号都是n时,有效的括号组合添加到结果集
    if (left == n && right == n) {
        list.add(str);
    }
    dfs(left + 1, right, n, str + '(', list);
    dfs(left, right + 1, n, str + ')', list);
}

dfs最大深度为n+1,n最高为8,所以不会栈溢出。

方法二:按照卡特兰数的思路递归求出有效括号组合

其实括号匹配的有效组合数符合卡特兰数, n n n是括号对数, h ( n ) h(n) h(n)是有效的括号数。

h ( n ) = ∑ k = 0 n − 1 h ( k ) ∗ h ( n − 1 − k ) h(n)=∑^{n−1}_{k=0}h(k)∗h(n−1−k) h(n)=k=0n1h(k)h(n1k)

我简单讲解一下为何会有这种关系。

假设有n对括号,我们设第一个左括号为A,与A对应的右括号为B。那么AB之间的括号,设有k对,那么B右侧的括号,就有n-1-k对。k的取值范围为0~n-1,对应n种情况。这n种情况的组合数相加,刚好为我上面提到的卡特兰数公式。

那么我们只需要按照卡特兰数递归的同时,求出从0~n,所有有效的括号结果集,即可得出n对括号的有效组合。

java代码

public List<String> generate(int n, List<String>[] cache) {
    if (cache[n] != null) {
        return cache[n];
    }
    ArrayList<String> ans = new ArrayList<>();
    if (n == 0) {
        ans.add("");
    } else {
        for (int k = 0; k < n; k++) {
            for (String left : generate(k, cache)) {
                for (String right : generate(n - 1 - k, cache)) {
                    //"("即为第一个左括号,")"即为第一个左括号对应的右括号,
                    // left即为k对括号中的一种有效组合,right即为n-1-k对括号中的一种有效组合
                    ans.add("(" + left + ")" + right);
                }
            }
        }
    }
    cache[n] = ans;
    return ans;
}

public List<String> generateParenthesis(int n) {
    List<String>[] cache = new ArrayList[n + 1];
    return generate(n, cache);
}

相似题目

[leetcode] 10. 正则表达式匹配
[leetcode] 17. 电话号码的字母组合


  • 个人公众号
    个人公众号
  • 个人小游戏
    个人小游戏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1432537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机编码:原码、反码、补码的思想、原理和实例(详细版)

​ 目录 收起 一、原码、反码、补码的意义 意义&#xff1a; 三、原码 原码的特点&#xff1a; 原码存在的问题&#xff1a; 四、反码 反码的特点&#xff1a; 存在的问题&#xff1a; 五、补码 六、补码的思想&#xff08;模&&同余数&#xff09; 模 && 同余数…

exF2FS: Transaction Support in Log-Structured Filesystem——泛读笔记

FAST 2022 Paper 分布式元数据论文汇总 问题 现代应用程序努力以崩溃一致的方式保护其数据&#xff0c;这通常分布在多个文件抽象之上。在底层文件系统缺乏事务支持的情况下&#xff0c;应用程序使用复杂的协议来确保跨多个文件的事务性更新&#xff0c;产生长序列的写操作和…

小林Coding_操作系统_读书笔记

一、硬件结构 1. CPU是如何执行的 冯诺依曼模型&#xff1a;中央处理器&#xff08;CPU&#xff09;、内存、输入设备、输出设备、总线 CPU中&#xff1a;寄存器&#xff08;程序计数器、通用暂存器、指令暂存器&#xff09;&#xff0c;控制单元&#xff08;控制CPU工作&am…

自研人工智能小工具-小蜜蜂(国外ChatGpt的平替)

国内有非常多好用的人工智能工具&#xff0c;但均无法完全替代国外ChatGpt。 ChatGPT相较于其他国内工具的优势在于以下几点&#xff1a; 创新的语言生成能力&#xff1a;ChatGPT是由OpenAI开发的先进的自然语言生成模型&#xff0c;它采用了大规模的预训练和精细调整方法。因此…

蓝桥杯刷题day06——平均

1、题目描述 有一个长度为n 的数组&#xff08;n 是 10 的倍数&#xff09;&#xff0c;每个数ai都是区间 [0,9] 中的整数。 小明发现数组里每种数出现的次数不太平均&#xff0c;而更改第i 个数的代价为bi&#xff0c; 他想更改若干个数的值使得这10 种数出现的次数相等&…

创建TextMeshPro字体文件

相比于Unity的Text组件&#xff0c;TextMesh Pro提供了更强大的文本格式和布局控制&#xff0c;更高级的文本渲染技术&#xff0c;更灵活的文本样式和纹理支持&#xff0c;更好的性能以及更易于使用的优点。但unity自带TextMeshPro字体不支持中文。这里使用普通字体文件生成Tex…

前端登陆加密解决方案

项目背景 环食药烟草的数据下载模块中&#xff0c;需要判断用户在进行数据下载时是进行了登录操作&#xff0c;如果没有登录要跳转登陆页面&#xff0c;输入账号和密码进行登录。 使用场景 项目中需要前端书写登录页面&#xff0c;用户输入账号密码&#xff0c;前端获取到用…

Allegro中设置让Route Keepout(禁止布线区)允许布线或打过孔的方法

Allegro中设置让Route Keepout&#xff08;禁止布线区&#xff09;允许布线或打过孔的方法 Chapter1 Allegro中设置让Route Keepout&#xff08;禁止布线区&#xff09;允许布线或打过孔的方法一、前言二、设置方法 Chapter2 Cadence Allegro PCB设计88问解析(二十三) 之 Alleg…

QT中QComboBox添加点击事件,实现下拉框自动刷新

因为项目需要&#xff0c;在QT中的ui界面添加QComboBox控件&#xff0c;需求是实现控件的点击事件&#xff0c;查了资料&#xff0c;发现这个控件类的本身是没有点击信号可以使用的。 但是QT是基于C的面向对象&#xff0c;有了这个特点&#xff0c;我们就可以继承原来的类&…

认识Tomcat (一)

认识Tomcat &#xff08;一&#xff09; 一、服务器 1.1 服务器简介 ​ 硬件服务器的构成与一般的PC比较相似&#xff0c;但是服务器在稳定性、安全性、性能等方面都要求更高&#xff0c;因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。 ​ 软件服务器&…

Docker 搭建mysql 集群(二)

PXC方案 很明显 PXC方案在任何一个节点写入的数据都会同步到其他节点&#xff0c;数据双向同步的&#xff08;在任何节点上都可以同时读写&#xff09; 创建MySQL PXC集群 1 安装PXC镜像 docker pull percona/percona-xtradb-cluster:5.7.21 2 为PXC镜像改名 docker tag pe…

从零开始手写mmo游戏从框架到爆炸(三)— 服务启动接口与网络事件监听器

上一章我们完成了netty服务启动的相关抽象&#xff08;https://blog.csdn.net/money9sun/article/details/136025471&#xff09;&#xff0c;这一章我们再新增一个全局的服务启动类&#xff0c;方便后续扩展。 服务启动 新增的两个类如下&#xff1a; 定义一个接口IServer …

react native错误记录

第一次运行到安卓失败 Could not find implementation class com.facebook.react.ReactRootProjectPlugin for plugin com.facebook.react.rootproject specified in jar:file:/D:/Android_Studio_Data/.gradle/caches/jars-9/o_3a1fd35320f05989063e7069031b710f/react-nativ…

Linux命令·

debian linux: deb 软件包 deb软件包分为两种&#xff0c;.deb二进制软件包&#xff0c;.dsc源码包 软件包的两种管理工具 1.dpkg 软件包软件的安装包必须存在 不能从镜像点获得安装包 不能检测软件之间的依赖关系 dpkg -i package.deb #安装包 dpkg -r package …

Elasticsearch:使用 Inference API 进行语义搜索

在我之前的文章 “Elastic Search 8.12&#xff1a;让 Lucene 更快&#xff0c;让开发人员更快”&#xff0c;我有提到 Inference API。这些功能的核心部分始终是灵活的第三方模型管理&#xff0c;使客户能够利用当今市场上下载最多的向量数据库及其选择的转换器模型。在今天的…

SpringBoot 登录检验JWT令牌 生成与校验

JWT官网 https://jwt.io/ 引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>设置过期时间 LocalDateTime localDateTime LocalDateTime.now().…

uniapp中使用EelementPlus

uniapp的强大是非常震撼的&#xff0c;一套代码可以编写到十几个平台。这个可以在官网上进行查询uni-app官网。主要还是开发小型的软件系统&#xff0c;使用起来非常的方便、快捷、高效。 uniapp中有很多自带的UI&#xff0c;在创建项目的时候&#xff0c;就可以自由选择。而E…

React Native学习记录

一、创建RN项目的时候是空文件夹的问题 1.使用npx react-native init RNDemos初始化项目的时候&#xff0c;会报错&#xff0c;模版错误&#xff0c;然后创建出来一个空的文件夹 2.如果出现这种情况&#xff0c;需要设置npm install -g react-native-cli 3.安装完成以后再次初…

python 多线程编程(一)

文章目录 threading - 基于线程的并行线程对象thread 类thread方法thread 属性例子 锁对象递归锁对象 条件对象 队列Queue对象SimpleQueque 对象例子 最近的工作需要用到多线程提升程序的运行效率&#xff0c;以前一直没有机会进行多线程编程&#xff0c;所以一直没有机会学习p…

QEMU源码全解析 —— 内存虚拟化(2)

接前一篇文章&#xff1a; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 QEMU内存管理模型 特此致谢&#xff01; QEMU内存初始化 1. 基本结构 在开始介绍内存初始化…