22、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:

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

要点

  • 回溯 backtracking
  • 剪枝

明显地,可以用回溯法来解。判断条件为:

    leftCount:左括号数
    rightCount:右括号数
    str: 记录生成的括号串

    leftCount > n => 不可能有解,剪枝
    rightCount > leftCount => 不可能有解,剪枝
    str.length() == n * 2:得到一个解

回溯法在每一步,本来应该用for循环,枚举此次所有可能的情况,如八皇后的棋盘列数。但是这里只有加左括号和右括号两种,直接写就可以了。

代码:

    public List generateParenthesis(int n){
        List list = new ArrayList();
        if(n == 0)
            return list;

        backTrack(list , n , 0 , 0 , "");
        return list;
    }

    /*
        leftCount:左括号数
        rightCount:右括号数
        str: 记录生成的括号串

        leftCount > n => 不可能有解,剪枝
        rightCount > leftCount => 不可能有解,剪枝
        str.length() == n * 2:得到一个解
     */
    public void backTrack(List list , int n , int leftCount , int rightCount , String str){
        // 剪枝
        if(leftCount > n)
            return;
        if(rightCount > leftCount)
            return;

        // 找到正确答案
        if(str.length() == n * 2){
            list.add(str);
            return;
        }

        // 这里本来应该用for循环,枚举此次所有可能的情况,如八皇后的棋盘列数。但是这里只有加左括号和右括号两种,直接写就可以了
        // 左括号的情况
        str += '(';
        int newLeftCount = leftCount + 1;
        backTrack(list , n , newLeftCount , rightCount , str);

        // 回溯
        str = str.substring(0 , str.length() - 1);

        // 右括号的情况
        str += ')';
        if(str.length() == 1)// 第一位不可能是')'
            return;
        int newRightCount = rightCount + 1;
        backTrack(list , n , leftCount , newRightCount , str);

    }

你可能感兴趣的:(22、Generate Parentheses)