LeetCode 第22题 括号生成

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

例如,给出 n = 3,生成结果为:
[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]
 */
/* 思路:回溯剪枝 时间复杂度为O(n2^n)  如果剪枝严格到一定程度,可不需要调用isMatch()验证,时间复杂度降为O(2^n).      当限制趋于严格,leetCode击败对手从5%变为97%      剪枝函数 1.左括号数不能超过总括号数一半              2.当前右括号数不能多于左括号数              3.最后一个位置不能填左括号,第一个位置不能填右括号.

*/
 4
 1 class Solution23 {
 2
 3   public List<String> generateParenthesis(int n) {
 4     char[] solveArray = new char[2 * n];
 5     List<String> list = new ArrayList<>();
 6     search(2 * n, 0, solveArray, list, 0, 0);
 7     return list;
 8   }
 9
10   private void search(int n, int level, char[] solveArray, List<String> list, int left, int right) {
11
12     if (level == n) {
13       //if (isMatch(solveArray)) {  //当限制趋于严格,不必再花费O(n)的时间检查括号匹配是否正确
14       list.add(String.valueOf(solveArray));
15       // }
16     } else {
17       if (right < left) {
18         solveArray[level] = ‘)‘;
19         search(n, level + 1, solveArray, list, left, right + 1);
20       }
21       if (left < n / 2 && level != n - 1) {
22         solveArray[level] = ‘(‘;
23         search(n, level + 1, solveArray, list, left + 1, right);
24       }
25     }
26   }
27
28   private boolean isMatch(char[] solveArray) {
29     System.out.println(solveArray);
30     Stack<Character> stack = new Stack<>();
31     for (char c : solveArray) {
32       if (c == ‘(‘) {
33         stack.push(‘(‘);
34       } else {
35         if (stack.isEmpty()) {
36           return false;
37         }
38         stack.pop();
39       }
40     }
41     return stack.isEmpty();
42   }
43 }


原文地址:https://www.cnblogs.com/rainbow-/p/10269291.html

时间: 2024-10-12 16:44:30

LeetCode 第22题 括号生成的相关文章

LeetCode第[22]题(Java):Generate Parentheses

题目:制造括号序列 难度:Medium 题目内容: Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. 翻译: 给定n对括号,写一个函数来生成所有格式正确的括号组合. For example, given n = 3, a solution set is: [ "((()))", "(()())", "

leetcode第22题--Merge k Sorted Lists

problem:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 先合并两个list,再根据归并排序的方法递归合并.假设总共有k个list,每个list的最大长度是n,那么运行时间满足递推式T(k) = 2T(k/2)+O(n*k).根据主定理,可以算出算法的总复杂度是O(nklogk).空间复杂度的话是递归栈的大小O(logk). /** * De

[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系列]括号生成问题

给定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:有效的括号【20】

LeetCode:有效的括号[20] 题目描述 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认为是有效字符串. 示例 1: 输入: "()" 输出: true 示例 2: 输入: "()[]{}" 输出: true 示例 3: 输入: "(]" 输出: false 示例 4: 输入: "

【LeetCode每天一题】3Sum(三数之和)

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets. Example: Given array nums =

【leetcode-22】括号生成

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

LeetCode开心刷题五十一天——118. Pascal&#39;s Triangle 接触跳转表概念,不知用处 lamda逗号导致表达式加法奇怪不理解119. Pascal&#39;s Triangle II

118. Pascal's Triangle Easy 87984FavoriteShare Given a non-negative integer numRows, generate the first numRows of Pascal's triangle. In Pascal's triangle, each number is the sum of the two numbers directly above it. Example: Input: 5 Output: [ [1],