本题采用的是回溯+剪枝。生成括号我们可以看作将大问题分解为小问题,使用递归的思想解决,但在生成时需要满足生成的右括号小于等于左括号数才是有效的,利用该特点进行剪枝。

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return string字符串ArrayList
     */
    public ArrayList generateParenthesis (int n) {
        // write code here
        ArrayList list = new ArrayList();
        if(n==0){
            list.add("");
            return list;
        }
        generateAll(n,n,"",list);
        return list;
    }
    //left,right表示当前需要生成的剩余的左括号,右括号数
    public void generateAll(int left,int right,String str,List list){
        if(left == 0 && right == 0){ //结束条件
            list.add(str);
            return;
        }
        if(left>0){
            generateAll(left-1,right,str+"(",list);
        }
        if(right>left){
            generateAll(left,right-1,str+")",list);
        }
    }
}