[leetcode] 22. 括号生成

文章目录

  • 题目描述
  • 解题方法
    • 方法一: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.mfbz.cn/a/365936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV 14 - 自定义线性滤波

1 卷积 1-1概念 卷积是图像处理中一个操作,kernel在图像的每个像素上的操作。 Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点 1-2 卷积如何工作 把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值称为卷积处理。 …

期权定价模型系列[12]SVI随机波动率模型

SVI模型 SVI 模型由 Gatheral&#xff08;2004&#xff09;提出&#xff0c;模型假定市场不存在日历套利机会和蝶式套利机会&#xff0c; 并在这个条件下构建一个一般化参数模型&#xff0c;具体形式为&#xff1a; SVI模型的原理是基于市场数据进行 SVI 表达式的参数优化&am…

Java项目:基于SSM框架实现的教务管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm813基于SSM框架实现的教务管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#x…

2024美国大学生数学建模C题网球运动中的势头详解思路+具体代码

2024美国大学生数学建模C题网球运动中的势头详解思路具体代码 E题数据已更新&#xff0c;做E题的小伙伴推荐看看博主的E题解析文章。那么废话不多说我们继续来做C题。 赛题分析 我们先阅题&#xff1a; 在2023年温布尔登男单决赛中&#xff0c;20岁的西班牙新星卡洛斯阿尔卡…

IDEA如何进行远程Debug调试

背景&#xff1a; 使用docker进行CVE漏洞复现的时候&#xff0c;由于只能黑盒进行复现&#xff0c;并不能知道为什么会产生这个漏洞&#xff0c;以及漏洞的POC为什么要这么写&#xff0c;之前我都是通过本地debug来进行源码分析&#xff0c;后来搜了一下&#xff0c;发现可以进…

【可观测性系列】 OpenTelemetry Collector的部署模式分析

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是蓝胖子&#x1f947; ☁️博客首页&#xff1a;CSDN主页蓝胖子的编程梦 **&#x1f304;每日一句&#xff1a;白日莫闲过&#xff0c;青春不再来 大家好&#xff0c;我是蓝胖子&#xff0c;在前面我介绍了下OpenTeleme…

代码随想录算法训练营29期Day41|LeetCode 343,96

文档讲解&#xff1a;整数拆分 不同的二叉搜索树 343.整数拆分 题目链接&#xff1a;https://leetcode.cn/problems/integer-break/description/ 思路&#xff1a; 题目要求我们拆分n&#xff0c;拆成k个数使其乘积和最大&#xff0c;然而题目中并没有给出k&#xff0c;所以…

专业120+总分400+海南大学838信号与系统考研高分经验海大电子信息与通信

今年专业838信号与系统120&#xff0c;总分400&#xff0c;顺利上岸海南大学&#xff0c;这一年的复习起起伏伏&#xff0c;但是最后还是坚持下来的&#xff0c;吃过的苦都是值得&#xff0c;总结一下自己的复习经历&#xff0c;希望对大家复习有帮助。首先我想先强调一下专业课…

记录一次使用ant design 中 ConfigProvider来修改样式导致样式改变的问题(Tabs嵌套Tabs)

一 说明 继之前的一篇文章&#xff1a;antd5 Tabs 标签头的文本颜色和背景颜色修改 后&#xff0c;发现在被修改后的Tab中继续嵌套Tabs组件&#xff0c;这个新的Tabs组件样式跟外层Tabs样式也是一致的&#xff0c;如下图所示&#xff1a; 二 原因 在修改外层tabs样式时&…

再获殊荣!和鲸科技入选2023年中国云生态创新明星企业

1月30日&#xff0c;中国云产业联盟暨中关村云计算产业联盟&#xff08;下简称“云联盟”&#xff09;隆重推出“2023 年中国云生态创新明星企业”榜单&#xff08;下简称“榜单”&#xff09;&#xff0c;和鲸科技凭借多年深耕数据智能领域积累的卓越技术创新能力以及对云产业…

MZI 作为分光器相较于 DC 的优势

MZI 作为分光器相较于 DC 的优势 引言正文 引言 之前我们分别介绍了 MZI 和 DC&#xff0c;可参考如下文章。 MZI and MI Optical Waveguide(马赫曾德与迈克尔逊光波导) Directional Coupler&#xff08;定向耦合器&#xff09; 正文 如上图所示&#xff0c;当 symmetric MZI…

IP地址SSL证书申请全面指南

一、了解SSL证书与IP地址认证 SSL证书是通过权威数字证书颁发机构&#xff08;CA, Certificate Authority&#xff09;签发的一种电子文档&#xff0c;用于验证服务器身份并加密客户端与服务器之间的数据传输。通常情况下&#xff0c;SSL证书与域名关联&#xff0c;但也可以针…

SG2520CAA汽车用晶体振荡器

爱普生SG2520CAA是简单的封装晶体振荡器&#xff08;SPXO&#xff09;&#xff0c;具有CMOS输出&#xff0c;这款SPXO是汽车和高可靠性应用的理想选择&#xff0c;符合AEC-Q200标准&#xff0c;功耗低&#xff0c;工作电压范围为1.8 V ~ 3.3 V类型&#xff0c;宽工作温度-40℃~…

惊鸿一瞥-网络初识

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;惊鸿一瞥-网络初识 一.网络的发展过程 网络的发展过程是循序渐进的,大致可以分为四个阶段: 单机时代->局域网时代->广域网时代->互联网时代 单机时代:就是每个机器之间…

哇塞,这几种Java文件读写性能差距居然这么大?

引言 这是一篇性能比较的文章&#xff0c;不分析实现原理。主要是对比Java几种常见的文件写入方式 测试代码 主要分析Stream、StreamBuffer和mmap三种方式&#xff0c;对应的大致代码如下 public static void testBasicFileIO(List<Persona> list, String path) throw…

Galah:一款功能强大的LLM驱动型OpenAI Web蜜罐系统

关于Galah Galah是一款功能强大的Web蜜罐&#xff0c;该工具由LLM大语言模型驱动&#xff0c;基于OpenAI API实现其功能。 很多传统的蜜罐系统会模拟一种包含了大量网络应用程序的网络系统&#xff0c;但这种方法非常繁琐&#xff0c;而且有其固有的局限性。Galah则不同&…

P1825 [USACO11OPEN] Corn Maze S 广度优先搜索

文章目录 题目链接题目描述解题思路代码实现总结 题目链接 链接: P1825 [USACO11OPEN] Corn Maze S 题目描述 解题思路 这道题目是一个典型的迷宫问题&#xff0c;我们需要找出从起点到终点的最短路径。解决这类问题的常用方法是使用广度优先搜索&#xff08;BFS&#xff09…

Oracle 12.2 暴力处理sysaux空间占满问题

基本环境 数据库&#xff1a;oracle 12.2 RAC 操作系统&#xff1a;unix&solaris 11.3 报错现像 今天处理别的问题查看告警日志偶然发现大量的报错&#xff0c;无法扩展SYSAUX表空间 于是登录系统&#xff0c;查看系统表空间使用情况&#xff0c;发现SYSAUX表空间用满了 …

事件分发机制:demo复现子View的点击事件不起作用

demo使用的sdk是32 自定义一个MyLayout&#xff0c;继承自LinearLayout&#xff0c;重写onInterceptTouchEvent方法&#xff0c;返回true。如下&#xff1a; package com.exp.clickdemo;import android.content.Context; import android.util.AttributeSet; import android.vi…

GSM模块的使用及注意事项

1.如何使用&#xff1f; 最近&#xff0c;我准备使用GSM模块&#xff08;SIM900A&#xff09;发送英文短信到指定号码&#xff0c;翻阅资料如下&#xff1a; 可见&#xff0c;只要给该模块按照如下步骤发送指令&#xff1a; 就可以使得模块正常工作。&#xff08;SIM900A&#…
最新文章