思路
这道题就是在不停选括号,要么选左括号,要么选右括号。
并且,是有约束地选:

只要(有剩,就可以选(。 (((((这么选,都还不能判定为非法。
当剩下的)比(多时,才可以选),否则,)不能选,选了就非法了(结合下图感受一下)。
下图描述节点的状态有:当前构建的字符串、左 右括号所剩的数量。
图片说明

import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 
     * @return string字符串ArrayList
     */
    public ArrayList<String> generateParenthesis (int n) {

        if (n == 0) {
            return new ArrayList<String>();
        }

        ArrayList<String> list = new ArrayList<String>();
        backTrace("", 0, 0, n, list);
        return list;
    }

    public void backTrace (String currentStr, int leftNum, int rightNum, int n, ArrayList<String> list) {

        if (2 * n == currentStr.length()) {
            list.add(currentStr);
            return;
        }

        //如果左括号的数量 < n 因为下标是从0开始的 所以不能=n
        if (leftNum < n) {
            backTrace(currentStr + "(", leftNum+1, rightNum, n, list);
        }

        //如果右括号的数量 < leftNum 左括号的数量因为下标是从0开始的 所以不能=leftNum
        if (rightNum < leftNum) {
            backTrace(currentStr + ")", leftNum, rightNum+1, n, list);
        }
    }
}