看了一圈好像没有用我这个方法的,感觉实现起来很方便
核心是抓住  一个合法序列插入另一个合法序列任意位置仍然合法  这条性质
那么规模为n的问题 转化为 对规模为n-1的问题插入一对新括号的问题
给出JAVA实现如下
public ArrayList<String> generateParenthesis (int n) {
        ArrayList<String> arr=new ArrayList<>();
        if(n==0) return null;
        // write code here
        //合法括号 不以)开头,不以(结尾
        //即()开头结尾
        //消去几个()后,仍应该保持这个性质,比如())不行
        //一个合法序列插入另一个合法序列任意位置仍然合法
        //问题转化成,从一个括号开始,用其他括号慢慢插
        String init="()";
        if(n==1){
            arr.add(init);
            return arr;
        }
        HashSet<String> set=new HashSet<>();
        ArrayList<String> lastRes=generateParenthesis(n-1);
        for(String item:lastRes){
                        //可插入空位个数枚举,2(n-1)+1=2n-1
            for(int i=0;i<2*n-1;i++){
                String prefix;
                if(i==0) prefix="";
                else prefix=item.substring(0,i);
                
                String end;
                if(i==2*n-2) end="";
                else end=item.substring(i);
                set.add(prefix+"()"+end);
            }
        }
        for(Iterator<String> it=set.iterator();it.hasNext();){
            arr.add(it.next());
        }
        return arr;
}