LeetCode No22. 括号生成

题目

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

1 <= n <= 8

解题思路

回溯

合法的括号肯定是先写一个左括号,然后再加一个右括号,我们可以利用这一特性用DFS的方式去模拟所有可能的组合。

递推打表

很容易就可以想到,n=2时所有合法的串都是在n=1时合法的串的基础上再添加一个合法的"()"得来的,也就是求合法串长度为n的过程其实就可以做一个递推的打表,可惜我代码功力还是差了一点,官方的题解太强了。

AC代码

回溯

点击查看代码
class Solution {
    List<String> res;
    StringBuffer sb;

    private void DFS(int left, int rigth, int n, StringBuffer sb) {
        if( left == n && rigth == n ) {
            res.add(sb.toString());
            return ;
        }
        // 左括号个数小于右括号个数,此串不合法,回溯至上一步
        if( left<rigth ) {
            return ;
        }
        if( left<n ) {
            sb.append("(");
            DFS(left+1, rigth, n, sb);
            sb.deleteCharAt(sb.length()-1);
        }
        if( rigth<n ) {
            sb.append(")");
            DFS(left, rigth+1, n, sb);
            sb.deleteCharAt(sb.length()-1);
        }
    }

    public List<String> generateParenthesis(int n) {
        res = new ArrayList<>();
        sb = new StringBuffer();
        DFS(0, 0, n, sb);
        return res;
    }
}

递推打表

点击查看代码
class Solution {
    ArrayList[] cache = new ArrayList[100];

    public List<String> generate(int n) {
        if (cache[n] != null) {
            return cache[n];
        }
        ArrayList<String> ans = new ArrayList<String>();
        if (n == 0) {
            ans.add("");
        } else {
            for (int c = 0; c < n; ++c) {
                for (String left: generate(c)) {
                    for (String right: generate(n - 1 - c)) {
                        ans.add("(" + left + ")" + right);
                    }
                }
            }
        }
        cache[n] = ans;
        return ans;
    }

    public List<String> generateParenthesis(int n) {
        return generate(n);
    }
}
posted @ 2022-04-23 15:27  Asimple  阅读(18)  评论(0编辑  收藏  举报