BM60 括号生成

描述

给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。

例如,给出n=3,解集为:

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

数据范围:递归/回溯(五)括号生成_空间复杂度

要求:空间复杂度 递归/回溯(五)括号生成_java_02,时间复杂度 递归/回溯(五)括号生成_Java_03

示例1

输入:

1
  • 1.

返回值:

["()"]
  • 1.


示例2

输入:

2
  • 1.

返回值:

["(())","()()"]
  • 1.


Java代码

import java.util.*;

public class Solution {
    public ArrayList<String> generateParenthesis (int n) {
        // 长度为2n,每位上两个状态    ( = 0    )  = 1     枚举所有可能的状态,找出满足条件的状态对应成括号
        // 1.状态中 0 和 1 数量相同
        // 2.不存在右括号数量比左括号数量多的前缀
        int m = n << 1, l = 0;  // 待匹配左括号的数量
        char[] s = new char[m];
        ArrayList<String> res = new ArrayList<>();
        for (int i = 0; i < (1 << m); i++) {
            l = 0;
            for (int j = 0; j < m; j++) {
                if ( (i >> j & 1) == 0 ) {
                    l++;
                    s[j] = '(';
                } else {
                    // 直接消掉一个左括号,不用单独统计右括号数量
                    l--;
                    // 说明右括号比之前的左括号多了,该状态无效
                    if (l < 0) break;
                    s[j] = ')';
                }
            }
            // 说明状态的左右括号数量相同,且没有出现一个右括号数量比左括号数量多的前缀  为有效状态
            if (l == 0) {
                res.add(new String(s));
            }
        }
        return res;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.


import java.util.*;

public class Solution {
     public ArrayList<String> generateParenthesis (int n) {
        ArrayList<String> ans=new ArrayList<>();
        build("",0,0,n,ans);
        return ans;
    }
    public void build(String str,int left,int right,int n,ArrayList<String> ans){
        //截至条件
        if(left==n&&right==n){//左右括号都用完了
            ans.add(str);
        }
        if(left<right){//先走的left只可能大于等于right ,这里剪枝
            return;
        }
        if(left<n){//先左括号
            build(str+"(",left+1,right,n,ans);
        }
        if(right<n){
            build(str+")",left,right+1,n,ans);
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.


public class Solution {
    public ArrayList<String> generateParenthesis(int n) {
        // write code here
        ArrayList<String> list = new ArrayList<>();
        recurse(0, 0, new String(), list, n);
        return list;
    }

    public void recurse(int left, int right, String str, ArrayList<String> list,
                        int n) {
        if (left == n && right == n) {
            list.add(str);
            return;
        }
        // 进一次左括号
        if (left < n ) {
            recurse(left + 1, right, str + "(", list, n);
        }

        // 进一次右括号
        if (right < n && left > right) {
            recurse(left, right + 1, str + ")", list, n);
        }
    }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.