程序员面试金典-面试题 08.09. 括号

题目:

括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。

说明:解集不能包含重复的子集。

例如,给出 n = 3,生成结果为:

[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]

分析:

dfs搜索,如果当前左括号用超了,右括号用超了,或者右括号的数量大于左括号的数量直接返回。

而如果左右括号刚好用尽,代表生成一个结果,记录下来。

然后就是递归,添加左括号,右括号。

程序:

class Solution {
    public List<String> generateParenthesis(int n) {
        res = new ArrayList<>();
        StringBuilder str = new StringBuilder();
        generateParenthesis(0, 0, n, str);
        return res;
    }
    private void generateParenthesis(int l, int r, int n, StringBuilder str){
        if(r > n || l > n || r > l)
            return;
        if(r == n && l == n){
            res.add(str.toString());
            return;
        }
        generateParenthesis(l+1, r, n, new StringBuilder(str).append("("));
        generateParenthesis(l, r+1, n, new StringBuilder(str).append(")"));
    }
    private List<String> res;
}

 

posted @ 2020-03-11 13:59  silentteller  阅读(313)  评论(0编辑  收藏  举报