难度中等1552
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1 输出:["()"]
提示:
1 <= n <= 8
通过次数225,350提交次数293,515
思路是:采用类二叉树回溯法(lc39,40,78等),选括号或者不选括号,首先符合条件一定是左括号在头位置。
括号匹配的特殊点是:添加某括号时,左括号的数量要大于等于右括号的数量。
我们可以用一个数来表示当前添加右括号的数量,一个表示左括号的数量,以此条件做二叉树剪枝即可!
解答成功:
执行耗时:1 ms,击败了96.21% 的Java用户
内存消耗:38.7 MB,击败了43.04% 的Java用户
class Solution {
List<String> res =new ArrayList<>();
public void func(String s,int n,int nleft,int nright){
if(nleft<nright) return;//右括号比左括号多
if(nleft==nright&&nleft==n) {
//左括号数量等于右括号数量,且达到n个
res.add(s);
return;
}
//添加左括号
if(nleft<n){
func(s+"(", n,nleft+1,nright);
}
//添加右括号
func(s+")",n, nleft, nright+1);
}
public List<String> generateParenthesis(int n) {
func("(",n,1,0);
return res;
}
}