给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。
例如,给出n=3,解集为:
“((()))”, “(()())”, “(())()”, “()()()”, “()(())”
本题需要用到回溯思路,构建完一个完整的括号序列后需要回溯到某个半成品状况,再改动括号的添加顺序以构建新的序列。回溯中的关键点是每个节点的右括号剩余数目不能少于左括号。
public ArrayList<String> generateParenthesis (int n) {
// write code here
ArrayList<String> res = new ArrayList<>();
backtrack("",0,0,n,res);
return res;
}
void backtrack(String str,int open,int close,int n,ArrayList<String> res){
if(str.length() == n*2){
res.add(str);
return;
}
if(open < n){
backtrack(str+"(",open+1,close,n,res);
}
if(close < open){
backtrack(str+")",open,close+1,n,res);
}
}