22. 括号生成
题目描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
实现
class Solution {
private List<String> res;
public List<String> generateParenthesis(int n) {
res = new ArrayList<>();
char[] sub = new char[2 * n]; //不同的括号组合
generate(0, 0, 0, sub, n);
return res;
}
/**
* 生成各种括号的组合
* @param index 当前插入括号的位置
* @param leftNum 左括号的个数
* @param rightNum 右括号的个数
* @param sub 不同的括号组合
* @param n 需要生成的括号总数
*/
private void generate(int index, int leftNum, int rightNum, char[] sub, int n) {
if(leftNum == n && rightNum == n) { //没有剩余的括号
res.add(new String(sub)); //生成一种组合
return;
}
if(leftNum <= n - 1) { //如果还有剩余的左括号
sub[index] = '(';
generate(index + 1, leftNum + 1, rightNum, sub, n);
}
if(rightNum < leftNum) { //如果右括号的数量小于左括号的个数
sub[index] = ')';
generate(index + 1, leftNum, rightNum + 1, sub, n);
}
}
}