22. 括号生成
难度 中等
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
1 <= n <= 8
题解
这道题是要让我们枚举所有正常的括号序列,那还是需要用的枚举方法,这里我使用递归枚举方法,这种方法可以搜索所有结果集,然后加上判断,就可以找到所有正常的括号序列。
那第一步是怎么进行搜索是关键,因为左括号''('',必须在做在左,先枚举左括号,然后再枚举右括号”)“
正常的括号有些限制条件
- 左括号或右括号个数不能超过括号的对数n
- 枚举的时候,右括号一定小于等于左括号数量,保证括号对的正确性
- 当以上条件都满足,左右括号都等于括号对数时,满足题目要求
class Solution {
List<String> list = new ArrayList<String>();//结果集
public List<String> generateParenthesis(int n) {
char[] temp = new char[n * 2];//辅助字符串
dfs(n, 0, 0, 0, temp);
return list;
}
//n为括号对数
//idx为当前temp辅助数组枚举到那个位置
//left左括号数量
//right右括号数量
//temp辅助数组
void dfs(int n, int idx, int left, int right, char[] temp){
if(right == n && left == n){//左右括号都等于括号对数时,满足题目要求
list.add(new String(temp));
return;
}
if(left < n){//先枚举左括号,且左括号数量一定小于n
temp[idx] = '(';
dfs(n, idx + 1, left + 1, right, temp);
}
if(left > right){//枚举右括号,右括号一定小于等于左括号数量
temp[idx] = ')';
dfs(n, idx + 1, left, right + 1, temp);
}
}
}