LeetCode22:括号生成
22. 括号生成 - 力扣(LeetCode)

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

思路:

  1. 最直接的思路,构建一个长度为2n的数组,针对每个位置枚举两种情况,最后校验生成的字符串是否合格(显然这个指数级别的时间复杂度不满足条件)

  2. 仔细思考左括号和右括号的限制条件(在第一个思路上进行减枝),对于当前持有left个左括号和right个右括号的数组来说,需要满足

    1. 左括号数量必须小于n
    2. 右括号数量必须小于左括号

    基于此我们可以得到加括号的限制条件:

    1. 如果左括号的数量小于n,仍可以继续插入左括号
    2. 如果右括号的数量小于左括号,仍可以插入右括号
      递归出口为右括号已经全部插入

代码实现如下:

{fold}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Solution {

    public List<String> generateParenthesis(int n) {

        List<String> ans = new ArrayList<>();

        dfs(0, 0, new StringBuilder(), ans, n);

        return ans;

    }



    private void dfs(int left, int right, StringBuilder path, List<String> ans, int n) {

        if (right == n) {

            ans.add(path.toString());

            return;

        }

        if(left < n) {

            path.append('(');

            dfs(left+1, right, path, ans, n);

            path.deleteCharAt(path.length()-1);

        }

        if(right < left) {

            path.append(')');

            dfs(left, right+1,path, ans, n);

            path.deleteCharAt(path.length()-1);

        }

    }

}