22.括号生成
- 括号生成
难度中等969
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3 输出:[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
时间:O(2^n)
思路:如果递归生成括号,会出现很多无效的括号,因此 在递归的过程中过滤掉一些不符合条件的括号。规律就是 生成n 也就是2n个括号 由于都是小括号,因此 左括号 和右括号 应该是相等的。如果left < n 继续 递归 由于一个右括号应该匹配一个左括号 当左括号 > 右括号 递归 当left 和 right == n的时候就停止 返回。
private List<String> result;//存储结果
public List<String> generateParenthesis(int n) {
result = new ArrayList<String>();
generate("",0,0,n);
return result;
}
//在recursion中过滤掉不符合条件的括号。
public void generate(String str,int left,int right,int n){
//终止条件
if(left == n && right == n){
result.add(str);
return;
}
if(left < n){
generate(str+"(",left+1,right,n);
}
if(left > right){
generate(str+")",left,right+1,n);
}
}