首页 > 试题广场 >

括号生成

[编程题]括号生成
  • 热度指数:59014 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。
例如,给出n=3,解集为:
"((()))", "(()())", "(())()", "()()()", "()(())"

数据范围:
要求:空间复杂度 O(n),时间复杂度 O(2^n)
示例1

输入

1

输出

["()"]
示例2

输入

2

输出

["(())","()()"]
头像 牛客题解官
发表于 2022-04-22 12:32:56
精华题解 题目主要信息: 求n对括号的全部合法组合,左右括号之间任意组合,只要合法就行 需要输出所有的结果 举一反三: 学习完本题的思路你可以解决如下题目: BM55. 没有重复项数字的全排列 BM56. 有重复项数字的全排列 BM58. 字符串的排列 方法:递归(推荐使用) 知识点:递归与回溯 递归是一 展开全文
头像 牛一霸
发表于 2021-07-07 22:06:18
精华题解 题目:括号的生成 描述:给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。 例如,给出n=3,解集为:"((()))", "(()())", "(())()", "()()()", " 展开全文
头像 蒙牛麦片
发表于 2021-07-16 17:46:10
精华题解 NC26 括号生成 题意分析: 给定数字n,枚举出n对括号可组成的合法组合。 题解一(暴力枚举): n对括号,一共2n个字符。用这2n个字符生成个序列,并且检查每一个序列是否时合法的括号序列。生成序列我们可以使用递归。判断生成的可以使括号序列用一种平衡的思想。假设一个括号序列有值。左括号(对值贡献为 展开全文
头像 下一次什么时候可以修改昵称
发表于 2020-10-28 21:30:15
算法 1.回溯法:回溯的过程是函数的进入与退出 2.记录左括号和右括号的数量: 当左括号数量小于n时继续添加左括号 当右括号数量小于左括号时继续添加右括号 public List<String> generateParenthesis(int n) { ArrayLis 展开全文
头像 多拿好offer_gx
发表于 2021-12-06 14:45:48
合法的括号序列需要满足两个条件: 序列的左右括号数量相同 序列的任一个前缀的左括号数量不少于右括号数量 基于此,使用DFS求解。代码如下: import java.util.*; public class Solution { /** * * @param n 展开全文
头像 已注销
发表于 2022-03-22 10:24:04
这题一开始看就那样,再看没思路,再看就跑路。 不至于不至于 你想下你做的最多是全排列,那种枚举类型的一看需要要用回溯,发现一个问题怎么回溯 他给你回溯的条件只有n,它代表了啥,左右括号都为n,我这题就是需要返回值的 我dfs的参数确定了,left,right,curStr 回溯终止条件是啥?是不是 展开全文
头像 sugar-tx
发表于 2021-02-05 14:15:53
先上代码 import java.util.*; public class Solution { /** * * @param n int整型 * @return string字符串ArrayList */ private ArrayL 展开全文
头像 牛客516598323号
发表于 2020-09-28 00:19:03
递归搜索,尝试增加括号,如果剩余的括号里左括号多于右括号,则不可能完成任务,抛弃结果;如果没有括号剩下,那么任务完成,把结果temp添加到ans。注意python没有传参,需要不断对原list对象赋值。https://www.cnblogs.com/ariel-dreamland/p/9133613 展开全文
头像 笨猪爆破组
发表于 2021-07-18 15:31:54
思路 这道题就是在不停选括号,要么选左括号,要么选右括号。并且,是有约束地选: 只要(有剩,就可以选(。 (((((这么选,都还不能判定为非法。 当剩下的)比(多时,才可以选),否则,)不能选,选了就非法了(结合下图感受一下)。 下图描述节点的状态有:当前构建的字符串、左 右括号所剩的数量。 回 展开全文
头像 牛客941408990号
发表于 2021-09-18 23:00:35
# # # @param n int整型 # @return string字符串一维数组 # class Solution: def generateParenthesis(self , n ): # write code here if n==0: 展开全文
头像 Cintia.Xiong
发表于 2021-11-21 13:29:26
思想:每一个合法组合的首末位是确定的,即所有的组合都为(####)。其中,根据排列组合的知识可以知道,我们还有2n-2个位置需要确定。其中,只需要确定左括号(的位置就可以了。 代码解释:这里的基本思想是一个一个加,先从一个左括号(开始,一个循环之后变成[((,()],然后变成[(((,((),()( 展开全文
头像 OfferCall!
发表于 2021-04-01 08:18:01
为了防止出现右括号在左括号前面的情况发生,每次递归一定要先考虑左括号,当左括号的情况考虑完了,再考虑右括号,而且要保证每次递归时已有的右括号的数量不能大于左括号的数量,否则也会造成交叉。 public ArrayList<String> generateParenthesis (int 展开全文
头像 讲道理的豹子说这不是bug
发表于 2023-08-08 13:34:55
方法:递归 + 回溯首先我们可以把问题当成n个左括号和n个右括号的排列问题。那么要保证排列是正确的,只要保证排列时:1、第一个元素为左括号;2、排列时,使用右括号需要保证此时字符串中的左括号比右括号多。根据上面两个特性,可以使用递归来进行解答。具体做法:step 1:将空串与左右括号各自使用了0个送 展开全文