【算法 -- LeetCode】(022) 括号生成

news2024/11/25 22:25:50

在这里插入图片描述

1、题目

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

示例 1:

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

示例 2:

输入:n = 1
输出:[“()”]

题目链接:https://leetcode.cn/problems/generate-parentheses

2、图解

第 1 步:定义状态 dp[i]

使用 i 对括号能够生成的组合。

注意:每一个状态都是列表的形式。

第 2 步:状态转移方程:

  • i 对括号的一个组合,在 i - 1 对括号的基础上得到;
  • i 对括号的一个组合,一定以左括号 “(” 开始(不一定以 “)” 结尾),为此,我们可以枚举右括号 “)” 的位置,得到所有的组合;
  • 枚举的方式就是枚举左括号 “(” 和右括号 “)” 中间可能的合法的括号对数,而剩下的合法的括号对数在与第一个左括号 “(” 配对的右括号 “)” 的后面,这就用到了以前的状态。

状态转移方程是:

dp[i] = "(" + dp[可能的括号对数] + ")" + dp[剩下的括号对数]

  • “可能的括号对数” 与 “剩下的括号对数” 之和得为 i,故“可能的括号对数” j 可以从 0 开始,最多不能超过 i, 即 i – 1;
  • “剩下的括号对数” + j = i – 1,故 “剩下的括号对数” = i – j – 1。
    整理得:

dp[i] = "(" + dp[j] + ")" + dp[i- j - 1] , j = 0, 1, ..., i - 1

第 3 步:思考初始状态和输出

初始状态:因为我们需要 0 对括号这种状态,因此状态数组 dp 从 0 开始,0 个括号当然就是 [“”]。
输出:dp[n] 。
这个方法暂且就叫它动态规划,这么用也是很神奇的,它有下面两个特点:

1、自底向上:从小规模问题开始,逐渐得到大规模问题的解集;

2、无后效性:后面的结果的得到,不会影响到前面的结果。

3、Java 示例代码

class Solution {
    public List<String> generateParenthesis(int n) {
        if (n == 0) {
            return new ArrayList<>();
        }
        // 这里 dp 数组我们把它变成列表的样子,方便调用而已
        List<List<String>> dp = new ArrayList<>(n);

        List<String> dp0 = new ArrayList<>();
        dp0.add("");
        dp.add(dp0);

        for (int i = 1; i <= n; i++) {
            List<String> cur = new ArrayList<>();
            for (int j = 0; j < i; j++) {
                List<String> str1 = dp.get(j);
                List<String> str2 = dp.get(i - 1 - j);
                for (String s1 : str1) {
                    for (String s2 : str2) {
                        // 枚举右括号的位置
                        cur.add("(" + s1 + ")" + s2);
                    }
                }
            }
            dp.add(cur);
        }
        return dp.get(n);
    }
}

执行结果:
在这里插入图片描述

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

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

相关文章

软件测试测试用例

等价类&#xff1a;把输入的数据可以分为有效的数据和无效的数据 被测试的对象输入的数据&#xff1a; 1、有效的数据 2、无效的数据 测试一个产品&#xff0c;需要考虑它的正确场景&#xff0c;也需要考虑它的异常场景 边界值:边界值测试用例是针对等价类测试用例方法的补…

7月第2周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩)发布!

飞瓜轻数发布2023年7月10日-7月16日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

【基于 GitLab 的 CI/CD 实践】04、GitLab Pipeline 实践(中)

目录 cache 缓存 cache:paths cache:key 缓存标记 cache:key:files 文件变化自动创建缓存 cache:key:prefix 组合生产 SHA 校验和 cache:policy 缓存策略 综合实例(一) 全局缓存 Pipeline 日志分析 Runner 缓存 综合实例&#xff08;二&#xff09; artifacts 制品…

NOTA P2 RM26,拮抗剂,与NOTA螯合剂偶联,结构式及相关应用介绍

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 英文名称&#xff1a;NOTA-P2-RM26 规格标准&#xff1a;1g、5g、10g CAS&#xff1a;N/A 分子式&#xff1a;C73H110N18O19 分子量&#xff1a;1543.8NOTA-P2-RM26结构式&#xff1a; 反应机理&#xff1a; NOTA-P2-RM26&…

八股总结(七)MySQL与Redis

文章目录 MySQL基础概念数据库三大范式是什么&#xff1f; 索引 Redis基本概念1、为什么用Redis作为MySQL的缓存&#xff1f; 数据结构2、Redis包含哪些数据类型&#xff1f;使用场景是什么&#xff1f;3、五种场景的Redis数据类型底层都是怎么实现的&#xff1f; Redis线程网络…

Mysql如何查询出两个日期之间的所有日期?

问题&#xff1a; 有时我们在生成一些时间轴类似的数据时&#xff0c;要求数据库不管有没有指定天的数据&#xff0c;都要生成该时间节点&#xff0c;可用mysql.help_topic来解决此类问题&#xff0c;通过序列和日期函数相结合来满足我们的业务需求。 例如&#xff1a;查询20…

ASUS华硕ROG幻14 2021款GA401QM原厂Win10系统工厂模式带ASUS Recovery恢复功能

自带恢复分区、所有驱动、出厂主题壁纸LOGO、Office办公软件、奥创控制中心等预装程序 所需要工具&#xff1a;16G或以上的U盘(非必需) 文件格式&#xff1a;HDI,SWP,OFS,EDN,KIT,TLK多个底包 文件大小&#xff1a;11.34GB 注&#xff1a;恢复时会清空电脑上所有盘的数据&…

Kotlin开发笔记:类型安全和转换

Kotlin开发笔记:类型安全 类型安全是编程中非常重要的内容&#xff0c;在实际编程中我们总是会遇到许许多多的空指针异常&#xff0c;类型错误等异常。因此解决好类型安全的问题可以大大提升程序的健壮性。同时Kotlin针对类型安全就引入了许多有用的机制&#xff0c;它将帮助我…

pytorch 2.0初探:和pytorch 1.13的速度对比

看到pytorch2.0出来了&#xff0c;而且宣传提速明显&#xff0c;一行代码即可提速43%左右&#xff1a; compiled_model torch.compile(model) We then measure speedups and validate accuracy across these models. Since speedups can be dependent on data-type, we measu…

Laf v1.0 发布:函数计算只有两种,30s 放弃的和 30s 上线的

一般情况下&#xff0c;开发一个系统都需要前端和后端&#xff0c;仅靠一个人几乎无法胜任&#xff0c;需要考虑的特性和功能非常多&#xff0c;比如&#xff1a; 需要一个数据库来存放数据&#xff1b;需要一个文件存储来存放各种文件&#xff0c;比如图片文件&#xff1b;后…

旅行社优惠卡app软件开发

旅游行业的不断发展&#xff0c;越来越多的旅行社开始推出各种优惠卡来吸引游客。而随着智能手机的普及&#xff0c;开发一款旅行社优惠卡APP软件成为了一种必然的趋势。 该软件的主要功能是提供旅行社的各种优惠卡信息&#xff0c;包括优惠卡的种类、价格、使用范围、有效…

0基础学习VR全景平台篇 第65篇:VR直播-如何创建VR直播

开启一次VR直播只需简单三步&#xff1a;VR直播相机连接网线并开机>新建一个直播活动>将直播活动的推流地址填入直播相机。 1、将鼠标移至【开始创作】菜单&#xff0c;点击【全景直播】。 2、进入VR直播活动的创建页面&#xff0c;根据国家互联网相关政策&#xff0c;创…

Vant源码解析(四)----Popup弹出层,详解样式方法

这个功能&#xff0c;自己也手写过&#xff0c;毕竟有很多弹窗的嘛。 我自己写就是&#xff1a;一个背景层&#xff0c;然后一个盒子里面放内容。再写个显示隐藏事件。够够的了。 Vant的Popup弹出层 页面结构 短短一个背景加内容盒子&#xff0c;vant套了几层。 这是引用的组件…

linux 系统修改已经打好jar包的yml配置文件

工作中可能回遇到&#xff0c;jar包已经打好&#xff0c;并且文件已经上传了&#xff0c;但是突然发现配置文件中的某一个参数写错了&#xff0c;怎么办&#xff1f;重新打包&#xff1f;如果重新打包再上传的话太影响效率了。那么我们可以通过以下方法&#xff0c;修改已经上传…

致远电子冲刺上市:计划募资8亿元,实控人周立功、陈智红已离婚

7月18日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;其已向广州致远电子股份有限公司&#xff08;下称“致远电子”&#xff09;发出第1轮审核问询函。据贝多财经了解&#xff0c;致远电子于2023年6月21日在深圳证券交易所递交招股书&#xff0c;准备在创业板上市。 …

2023最新版本Activiti7系列-事件篇

事件篇 事件&#xff08;event&#xff09;通常用于为流程生命周期中发生的事情建模。事件总是图形化为圆圈。在BPMN 2.0中&#xff0c;有两种主要的事件分类&#xff1a;*捕获&#xff08;catching&#xff09;与抛出&#xff08;throwing&#xff09;*事件。 捕获: 当流程执…

【java】【基础1】数据类型运算符

目录 一、数据类型&#xff08;4大类8种&#xff09; 1.1类型转换 1、自动类型转换 2、表达式的自动类转换 3、强制类型转换 二、运算符 2.1基本算术运算符 2.2自增自减运算符 2.3赋值运算 2.4关系运算符 2.5逻辑运算符 2.6三元运算符 2.7运算符的优先级 三、API文档&am…

中国人民大学与加拿大女王大学金融硕士——行而不辍,履践致远

理论和实践哪个重要呢&#xff0c;申克・阿伦斯曾说过&#xff1a;“如果没有理论的指导&#xff0c;实践就会变得盲目&#xff1b;而如果没有实践的充实&#xff0c;那么理论就会显得空洞”。学习不能停留在理论层面&#xff0c;要用于实践才能真正的消化吸收。学习的目的在于…

第一次实操Python+robotframework接口自动化测试

目前我们需要考虑的是如何实现关键字驱动实现接口自动化输出&#xff0c;通过关键字的封装实现一定意义上的脚本与用例的脱离&#xff01; robot framework 的安装不过多说明&#xff0c;网上资料比较太多~ 实例&#xff1a;&#xff01;&#xff01;&#xff01;&#xff01…

【数学建模】--典型相关分析

典型相关分析&#xff08;Canonical Correlation analysis&#xff09;研究两组变量&#xff08;每组变量中都可能有多个指标&#xff09;之间相关关系的一种多元统计方法。它能够揭示出两组变量之间的内在联系。 例子&#xff1a; 典型相关分析定义&#xff1a; 列题分析&…