22. 括号生成
题目:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
代码:
class Solution { //回溯法,解集/最优解
public List
StringBuilder sb=new StringBuilder();
List
backRrack(1,n,sb,list);
return list;
}
public static void backRrack(int t,int n,StringBuilder asb,List<String> alist){ //回溯求解
if(t>2*n){
alist.add(asb.toString());
}
else{
//左括号进去
asb.append('(');
if(isMatchs(asb,n)){
backRrack(t+1,n,asb,alist);
}
asb.deleteCharAt(asb.length()-1);
//右括号进去
asb.append(')');
if(isMatchs(asb,n)){
backRrack(t+1,n,asb,alist);
}
asb.deleteCharAt(asb.length()-1);
}
}
public static boolean isMatchs(StringBuilder asb,int n){ //判断放进去是否为可行解
if(asb.charAt(0)==')'){return false;}
int j=0,temp=0;
for(int i=0;i<asb.length()&&j>=0;i++){
if(asb.charAt(i)=='('){
j++;
temp++;}
else{
j--;
}
}
if(j<0||temp>n){return false;}
if(j==0){return true;}
return true;
}
}