22.括号生成

题目:

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses

分析:

题目刚拿到的时候确实没有思路,看了一下LeetCode的题解,注意到最后方法三的闭合数解法。

这里官方是采用了一个遍历回溯的思路,保证每一个添加的集合都是有效的,如何保证有效呢?当然是左右对称,那么就可以得到如下的代码:

public static List<String> generateParenthesis(int n) {
    List<String> result = new ArrayList<String>();
    if (n == 0) {
        //结束回溯的关键
        result.add("");
    } else {
        for (int c = 0; c < n; ++c) {
            //遍历得到每一个需要添加的左右对称组合
            for (String left : generateParenthesis(c)) {
                for (String right : generateParenthesis(n - 1 - c)) {
                    //保证添加的左侧为对称的,右侧遍历而来,肯定也是对称的
                    result.add("(" + left + ")" + right);
                }
            }
        }
    }
    return result;
}

原文地址:https://www.cnblogs.com/doona-jazen/p/12004598.html

时间: 2024-10-08 19:25:19

22.括号生成的相关文章

[leetcode] 22. 括号生成

22. 括号生成 谨慎后,1A的概率貌似高了些 算是20题的升级版吧, 利用递归来拼成string,然后通过20. 有效的括号该题的代码来判断生成的string合不合法 看代码吧 class Solution { public List<String> generateParenthesis(int n) { List<String> ans = new ArrayList<>(); dfs(ans, "", n, n); return ans; }

LeetCode 22. 括号生成(Generate Parentheses)

题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n =3,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()" ] 解题思路 利用回溯的思想递归的生成括号.具体来说记录当前剩余左括号数left,剩余右括号数right,当前的生成括号字符串s,进行如下操作: 若left为0,说明左括

不积跬步无以至千里——LeetCode 22.括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()" ] 原文地址:https://www.cnblogs.com/7long/p/10265818.html

[LeetCode] 22. 括号生成(回溯/DP)

题目 给出?n?代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出?n = 3,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()"] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/generate-parentheses 著作权归领扣网络所有.商

[LeetCode系列]括号生成问题

给定n, 返回所有匹配的n对括号的可能形式. 如 给定 n = 3, 一个解集是: "((()))", "(()())", "(())()", "()(())", "()()()" 本题解法的思路是 使用栈seq保存经历的字符串状态; 使用栈valid保存对应的字符串中有效的括号对个数; 当seq不为空时(即回溯未结束): 当前的字符串和其中有效的括号对个数分别出栈; 1. 如果字符串长度等于待求解的长度,

c++刷题(21/100)树的打印、矩阵覆盖和括号生成

题目一:把二叉树打印成多行 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 思路:一开始以为2维的vector可以直接访问,但是试了是不行,会报错,vector在有值之前不能直接访问,所以这道题就是用两个队列,第一个队列q1放一层,然后把这层的孩子节点都塞到第二个队列q2,之后再从第二个队列q2把节点一个一个塞回队列q1里,然后重复这个流程直到q1为空 /* struct TreeNode { int val; struct TreeNode *left; struct Tre

【leetcode-22】括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()"] 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/generate-parentheses 回溯法 回溯算法基本思想:能进则

LeetCode 第22题 括号生成

/*给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()" ] */ /* 思路:回溯剪枝 时间复杂度为O(n2^n) 如果剪枝严格到一定程度,可不需要调用isMatch()验证,时间复杂度降为O(2^n). 当限制趋于严格,leet

LeetCode 22. Generate Parentheses (括号生成)

题目标签:Backtracking 建立一个 HashMap 来记录 括号的 数量,利用DFS, 先用 左括号, 在用 右括号, 当 右括号用完的时候 返回.具体看code. Java Solution: Runtime:  1 ms, faster than 85.94 % Memory Usage: 39.5 MB, less than 20.00 % 完成日期:12/12/2019 关键点:HashMap class Solution { HashMap<Character, Intege