import java.util.*;
public class Solution {
int left,right,n1;
ArrayList<String> ret ;
StringBuilder path;
public ArrayList<String> generateParenthesis (int n) {
//有效括号:左括号数量等于右括号,
//从头开始的任意一个子串左括号数量>=右括号
ret = new ArrayList<>();
path = new StringBuilder();
n1 = n;
left=right=0;
dfs();
return ret;
}
public void dfs(){
if(right==n1){
ret.add(path.toString());
return;
}
//在进行括号选择时有两种情况
if(left<n1){
//添加左括号
path.append('(');
left++;
//进入下一层
dfs();
//回溯
path.deleteCharAt(path.length()-1);
left--;
}
//添加右括号
if(right<left){
path.append(')');
right++;
//进入下一层
dfs();
//回溯
path.deleteCharAt(path.length()-1);
right--;
}
}
}