算法题之生成括号组合

题目: Generate Parentheses

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

"((()))", "(()())", "(())()", "()(())", "()()()"

正确的思考方式是采用DFS。

  • 如果左括号还能括就不断的画左括号,直到左括号的数量等于n。
  • 接下来考虑右括号,因为对于一对括号,右括号不能出现在左括号前,所以当右括号数量小于左括号时,加上右括号。
  • 当左右括号数量都等于n时,得到解。

这种策略可以保证每一步都是一个全新的解。

public class Solution {
    public ArrayList<String> generateParenthesis(int n) {
        ArrayList<String> strings = new ArrayList<String>();
        if (n == 0) return strings;

        dfs(0, 0, "", strings, n);

        return strings;
    }

    private void dfs(int left, int right, String buffer, ArrayList<String> strings, int n) {
        if (left == n && right == n) {
            strings.add(buffer);
            return;
        }

        if (left < n) {
            dfs(left + 1, right, buffer + "(", strings, n);
        }

        if (left > right) {
            dfs(left, right + 1, buffer + ")", strings, n);
        }
    }
}

 

posted @ 2017-08-13 10:22  蓝鲸王子  阅读(814)  评论(1编辑  收藏  举报