BM60 括号生成
描述
给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。
例如,给出n=3,解集为:
"((()))", "(()())", "(())()", "()()()", "()(())"
数据范围:
要求:空间复杂度 ,时间复杂度
示例1
输入:
返回值:
示例2
输入:
返回值:
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.