`

Leetcode - Generate Parentheses

 
阅读更多
[分析]
第一个思路(错误的~):假设递归函数返回 n - 1对括号组成的所有合法字符串,将其看做整体A,则 所求 n 对括号组成的合法字符串是所有()A,A(),(A)。这个思路对于n<=3是可行的,一旦 n > 4,就会漏解,比如对于 n=4, 会漏掉(())(())
第二个思路:递归构造出合法字符串,初始时拥有 n 个左右括号,递归的每一层根据当前资源情况添加一个左括号或者右括号后继续递归,递归结束条件是 n 个左右括号正好使用完。
对于每次递归,仅当剩余左括号数 < 剩余右括号数时本次可添加右括号,否则已构成的字符串中没有左括号可与新加上右括号匹配。
这是一个经典的卡特兰数问题,可参考wikipedia:
https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0

public class Solution {
    // Method 2
    List<String> result = new ArrayList<String>();
    public List<String> generateParenthesis1(int n) {
        result.clear();
        recur(n, n, new StringBuilder());
        return result;
    }
    
    public void recur(int left, int right, StringBuilder item) {
        if (left == 0 && right == 0) {
            result.add(item.toString());
            return;
        }
        if (left < right) {
            item.append(')');
            recur(left, right - 1, item);
            item.deleteCharAt(item.length() - 1);
        }
        if (left > 0) {
            item.append('(');
            recur(left - 1, right, item);
            item.deleteCharAt(item.length() - 1);
        }
    }
    
    // Method 1: Fail @ n ==4, miss "(())(())"
    public Set<String> recur(int n) {
        Set<String> result = new HashSet<String>();
        if (n == 1) {
            result.add("()");
            return result;
        }
        Set<String> sub = recur(n - 1);
        for (String str : sub) {
            result.add("(" + str + ")");
            result.add("()" + str);
            result.add(str + "()");
        }
        return result;
    }
}
分享到:
评论

相关推荐

    js-leetcode题解之22-generate-parentheses.js

    js js_leetcode题解之22-generate-parentheses.js

    C语言-leetcode题解之22-generate-parentheses.c

    c语言入门 C语言_leetcode题解之22-generate-parentheses.c

    java-leetcode题解之22-Generate-Parentheses

    java入门 java_leetcode题解之22_Generate_Parentheses

    java-leetcode题解之Generate Parentheses.java

    java java_leetcode题解之Generate Parentheses.java

    _leetcode-python.pdf

    - Generate Parentheses: 生成所有可能的有效的括号组合。 - Merge k Sorted Lists: 合并k个排序链表。 - Swap Nodes in Pairs / Reverse Nodes in k-Group: 这两个问题涉及到在链表中按特定规则交换节点或反转节点...

    leetcode2-Algorithms-Practice:创建此repo是为了跟踪我在解决问题方面的进展

    leetcode 2 LeetCode-练习 我的 ...Generate Parentheses 运行时间:164 毫秒内存使用:22.5 MB 26. Remove Duplicates from Sorted Array 运行时间:100 毫秒内存使用:15.2 MB 27. Remove Element

    leetcode答案-LeetCode:不要放弃

    leetcode 答案LeetCode 算法的复杂度分析。...因为是递回求解,所以很抽象不好懂,这里以leetcode的generate-parentheses一道题目为例,给定n,要找出n个括号的各种组合,例如n=2 ,答案会是[(()), ()()]

    leetcode信封-LeetCode:LeetCode解题

    Parentheses | ImplementstrStr.java //28. Implement strStr() │ LongestIncreasingSubsequence.java 300.Longest Increasing Subsequence | LongestPalindromicSubstring.java 5. Longest Palindromic Substring...

    leetcode中国-LeetCodeAnswerCollections:LeetCode题解精选代码收集

    generate-parentheses【】【中等】 这是一道递归题目,想法很重要,保证括号合法性是另一个要点 private List result; public List generateParenthesis(int n) { result = new ArrayList(); _generate(0, 0, n, "")...

    leetcode530-algorithm:算法

    leetcode 530 ** LeetCode 题目更新 ** 用来记录业余时间所做的算法题目,保持对于数据结构的熟悉。 ** Leetcode 题目列表 ...Parentheses ...Generate Parentheses 028 Implement strStr() 031 Next Permutat

    LeetCode 括号生成

    题目来源:https://leetcode-cn.com/problems/generate-parentheses/submissions/ 题目 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出 n = 3,生成结果为...

    程序员面试宝典LeetCode刷题手册

    第四章 Leetcode 题解 1. Two Sum 2. Add Two Numbers 3. Longest Substring Without ...22. Generate Parentheses 23. Merge k Sorted Lists 24. Swap Nodes in Pairs 25. Reverse Nodes in k-Group 26. Remove Dupli

    LeetCode 刷题汇总1

    * 生成括号(Generate Parentheses):生成所有可能的括号组合。 6. 字符串匹配: * 正则表达式匹配(Regular Expression Matching):实现正则表达式匹配。 * 实现strStr()(Implement strStr()):实现字符串...

    lrucacheleetcode-leetcode:leetcode

    lru缓存leetcode leetcode 1. Two Sum 2. Add Two ...Generate Parentheses 25. Reverse Nodes in k-Group 26. Remove Duplicates from Sorted Array 27. Remove Element 28. Implement strStr() 3

    c++-c++编程基础之leetcode题解第22题括号生成.zip

    第22题,"括号生成"(Generate Parentheses),是其中一道经典的动态规划问题,旨在考察程序员对递归、回溯以及组合的理解。这道题目要求我们生成所有有效的括号组合,即所有符合括号开闭规则的字符串。 题目描述:...

    LeetCode

    题目0022:"生成括号"(Generate Parentheses) 这是一个关于回溯算法和组合问题的题目。目标是生成所有有效的括号组合,这些括号字符串必须符合正确的左右括号匹配规则。通过递归或者动态规划的策略,我们可以构建...

    Dir-For-LeetCode

    022_Generate_Parentheses 023_Merge_k_Sorted_Lists 024_Swap_Nodes_in_Pairs 025_Reverse_Nodes_in_k-Group 026_Remove_Duplicates_from_Sorted_Array 027_Remove_Element 028_Implement_strStr() 029_...

    leetcode添加元素使和等于-programmer_practices:算法实践

    Generate Parentheses 18 3 sum 扩展版, 外层多套一个循环即可。注意判断重复及细节优化 19 细节:nodelist前插入一个dummy node. 删除倒数第n 等于正数查到len - n 20 用stack 最后stack应该是空的 21 遍历直到二...

Global site tag (gtag.js) - Google Analytics