[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 ...
随机推荐
- Python | 浅谈并发锁与死锁问题
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第24篇文章,我们一起来聊聊多线程场景当中不可或缺的另外一个部分--锁. 如果你学过操作系统,那么对于锁应该不陌生. ...
- 【java】java获取JVM启动参数 System.getProperty
java获取JVM启动参数 System.getProperty取 -D后的key即可 public class Test { public static void main(String[] arg ...
- 『JWT』,你必须了解的认证登录方案
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- netbox demo
参考链接:https://pypi.org/project/python-netbox/ # python 参考链接 https://ttl255.com/pynetbox-netbox-python ...
- 2020.5.21 第一篇 Scrum冲刺博客
Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.Alpha 阶段成员任务安排 二.明日任务安排 三.预期的任务量 四.敏捷开发前的感想 五.团队期望 一.Alpha ...
- 如何快速系统学会使用SPSS?
SPSS是一款数据统计与数据分析工具,操作简单属于数据分析的入门工具. 想要灵活使用SPSS,需要掌握两个方面内容:数据分析相关知识.SPSS操作 1 数据分析 在使用数据分析工具之前,首先要了解数据 ...
- Arduboy基本用法(一)
Arduboy基本用法(一) 一.第一个Arduboy程序 在arduino中新建项目 示例代码 #include<Arduboy.h> Arduboy arduboy; void set ...
- mysql图形化工具基本操作
一.DataType 常见的数据类型: - `int` 整数 - `varchar(len)` 字符串 - `tinyint(1)`布尔值 二.设置字段的特殊标识 - `PK`(`Primary Ke ...
- SEO外包好还是自己组建团队
http://www.wocaoseo.com/thread-151-1-1.html 营络营销已成为企业不可忽视的一块大肥肉,很多企业都想进来分一杯羹,但是不少企业苦于缺少过硬的技术,无 ...
- 常用Oracle SQL集锦
常用dml和query开并行 --开并行 ALTER SESSION FORCE PARALLEL DML PARALLEL 16; ALTER SESSION FORCE PARALLEL QUER ...