[LeetCode] 22. 括号生成(回溯/DP)
题目
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
方法一 回溯
- 回溯法使用递归,并在递归过程中考虑剪枝。此外,递归要考虑终止条件,考虑传的参数,参数可以包括结果的集合,一直要用的变的量,随着递归层数不同变化的计数量,临时的作为最终结果的str。
- 此题目中,从长度为0到长度为2n递归生成一组有效括号组合,满足条件的下一层递归分支才进入(即进行了剪枝):当当前左括号数量<n时,可以加一个左括号;当当前右括号数量小于左括号数量时,可以加一个右括号。这样保证所有生成的括号都是有效的。
方法二 DP
- 大概递归思想:
dp[n]='('+dp[i]+')'+dp[n-1-i] ,n 从0到用户输入的N,对于计算dp[n]遍历所有可能的i,,其中dp[n]表示长度为2*n的所有有效串。 - 存储方法也很有意思,用List<List> ans,最终用ans.get(n)获得长度为2*n的所有有效括号组合。
- 方法一二的时间复杂度相同,都只遍历了有效的分支,且没有重复。?
代码
代码一 回溯
class Solution {
public static List<String> generateParenthesis(int n) {
List<String> parenthesis = new ArrayList<>();
traceBack("", 0, 0, n, parenthesis);
return parenthesis;
}
private static void traceBack(String str, int left, int right, int n,
List<String> parenthesis) {
if (str.length() == 2 * n) {
parenthesis.add(new String(str));
return;
}
if (left < n) {
traceBack(str + '(', left + 1, right, n, parenthesis);
}
if (right < left) {
traceBack(str + ')', left, right + 1, n, parenthesis);
}
}
}
代码二 DP
class Solution {
public List<String> generateParenthesis(int n) {
List<List<String>> parenthesis = new ArrayList<>();// 所有长度<=2n的括号组合
// 将长度为0的括号组合,放入parenthesis
ArrayList<String> list = new ArrayList<>();
list.add("");
parenthesis.add(list);
// 由nn为1至n一层层算2*nn长度的括号组合,放入parenthesis
for (int nn = 1; nn <= n; ++nn) {
List<String> parenthesisTemp = new ArrayList<>();
for (int leftLen = 0; leftLen <= nn - 1; ++leftLen) {
for (String leftStr : parenthesis.get(leftLen)) {
for (String rightStr : parenthesis.get(nn - 1 - leftLen)) {
parenthesisTemp.add(new String('(' + leftStr + ')' + rightStr));
}
}
}
parenthesis.add(parenthesisTemp);
}
return parenthesis.get(n);
}
}
[LeetCode] 22. 括号生成(回溯/DP)的更多相关文章
- [LeetCode] 22. 括号生成 ☆☆☆(回溯)
描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()( ...
- LeetCode 22. 括号生成(Generate Parentheses)
22. 括号生成 22. Generate Parentheses 题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结 ...
- Java实现 LeetCode 22 括号生成
22. 括号生成 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", &quo ...
- LeetCode 22. 括号生成 C++(回溯法)
还是用回溯法暴力解题,遍历所有可能,不过还是在此基础上进行了一些的优化,来阻止那些不必要的遍历.好,上代码. class Solution { public: vector<string&g ...
- [LeetCode] 22. 括号生成
题目链接:https://leetcode-cn.com/problems/generate-parentheses/ 题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能 ...
- leetcode 22括号生成
非常好的一道题.一开始的思想是这样的,先把n对括号按照某一顺序生成一个string,然后用全排列算法生成所有可能,然后利用stack写一段判断括号是否匹配的字符串,匹配的假如结果中.不过会超时.因为全 ...
- LeetCode 22. 括号生成(Generate Parentheses)
题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n =3,生成结果为: [ "((()))", "(() ...
- leetcode 22. 括号生成 dfs
先思考符合要求的串是什么样子的 任意时刻,(数量大于),且最后(==)==n即可 考虑下一个加入string的字符时(或者)即可 dfs class Solution { public: vector ...
- Leetcode之回溯法专题-22. 括号生成(Generate Parentheses)
Leetcode之回溯法专题-22. 括号生成(Generate Parentheses) 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n ...
随机推荐
- nodejs版本DESede/CBC/PKCS5Padding算法封装(3des)
最近对接了一个第三方支付项目,用的加密算法是根本没听过的:DESede/CBC/PKCS5Padding 这个算法真的是坑爹了,网上搜索了一堆只有java版本是正常的,nodejs版本的各种问题,我了 ...
- 什么?Java9这些史诗级更新你都不知道?Java9特性一文打尽!
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解
本文是精讲响应式WebClient第2篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 在上一篇文章为大家介绍了响应式IO模型和WebClient的基本 ...
- Sqlalchemy 事件监听与初始化
sqlalchemy不仅仅能自动创建数据库,更提供了其他更强大的功能,今天要介绍的就是sqlalchemy中的事件监听,并将其应用到数据库的初始化中. 需求:当插入设置password字段时,自动加密 ...
- Linux查看系统硬件信息命令汇总
对工作中,经常用的查看系统硬件命令的一个简单总结 1.查看磁盘类型(是否SSD盘)cat /sys/block/sda/queue/rotational注意:命令中的sba是你的磁盘名称,可以通过df ...
- SpringBoot集成Swagger2,3分钟轻松入手!
一.引入maven <dependency> <groupId>io.springfox</groupId> <artifactId>springfox ...
- ORB-SLAM: A Versatile and Accurate Monocular SLAM System 笔记(二)
4. 自动地图初始化 地图初始化的目标是两个帧之间相对位姿来三角化一系列的点云(riangulate an initial set of map points),这个操作是独立与场景且不需要人为的干预 ...
- 什么是PR劫持和权重劫持
http://www.wocaoseo.com/thread-265-1-1.html PR劫持OR网站权重劫持虽然概念不一样,但是其原理是一样的,同样属于seo中的灰色手段,是我们抵制和反对的seo ...
- 分享一个操作pdf文件的js文件-pdfObject.js(文件预览、下载、打印等操作都具备)
获取相关资料或者源码的朋友可以关注下公众号,回复关键字pdf20200518即可
- 手写迷你Tomcat
手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat ...