给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
方法一:递归
class Solution {
public List<String> generateParenthesis(int n) {
List<String> liststr=new ArrayList();
generateAll(new char[2*n],0,liststr);
return liststr;
}
private static void generateAll(char[] cur,int i,List<String> liststr){ //递归
if(i==cur.length){
if(isvaild(cur))
liststr.add(String.valueOf(cur));
}
else{
cur[i]='(';
generateAll(cur,i+1,liststr);
cur[i]=')';
generateAll(cur,i+1,liststr);
}
}
private static boolean isvaild(char[] cur){ //判断括号是否符合要求
int vaild=0;
for(int i=0;i<cur.length;i++){
if(cur[i]=='(')
vaild++;
else
vaild--;
if(vaild<0)
return false;
}
return (vaild==0);
}
}
方法二:回溯
class Solution {
public List<String> generateParenthesis(int n) {
List<String> liststr=new ArrayList();
generateAll(liststr,"",0,0,n);
return liststr;
}
private static void generateAll(List<String> list,String str,int left,int right,int n){
if(str.length()==n*2)
list.add(str);
else{
//我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,
//如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。
if(left<n)
generateAll(list,str+"(",left+1,right,n);
if(right<left)
generateAll(list,str+")",left,right+1,n);
}
}
}