22. 括号生成

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

解题思路:
我觉得本质上来说,就是从数组中[‘(’, ‘)’]可重复地选择元素,生成一个长度为2n的括号组合。为了使这个括号组合是有效的,那么在选择的过程中就有一些约束:
1、左括号的数量不能超过n。
2、左括号的数量不能小于有括号的数量。
3、当左括号和有括号的数量都等于n时,就是收获结果的时候。
4、因为我们的path是使用的字符数组,直接覆盖掉了之前的值,所以不用恢复现场。只用恢复cnt1和cnt2即可。

class Solution {
    private List<String> result = new ArrayList<>();
    private char[] path;
    private static final char[] ch = new char[]{'(', ')'};
    public List<String> generateParenthesis(int n) {
        path = new char[2*n];
        backtrack(n, 0, 0);
        return result;
    }
    private void backtrack(int n, int cnt1, int cnt2){
        if(cnt1 == n && cnt2 == n){
            result.add(new String(path));
            return;
        }
        if(cnt1 > n || cnt1 < cnt2){
            return ;
        }
        for(char c : ch){
            path[cnt1 + cnt2] = c;
            if(c == '('){
                cnt1++;
            }else{
                cnt2++;
            }
            backtrack(n, cnt1, cnt2);
            if(c == '('){
                cnt1--;
            }else{
                cnt2--;
            }
        }
    }
}

你可能感兴趣的:(22. 括号生成)