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--;

        }
    }


}