import java.util.*;


public class Solution {
private ArrayList<String> ans = new ArrayList<>();

    /**
     * 生成所有有效的括号组合
     *
     * @param n 生成括号的对数
     * @return 包含所有有效括号组合的ArrayList
     */
    public ArrayList<String> generateParenthesis(int n) {
        // 使用StringBuilder来构建括号组合
        StringBuilder sb = new StringBuilder();
        // 回溯方法,传入左右括号剩余数量和当前构建的字符串
        backtrack(n, n, sb);
        // 返回所有有效的括号组合结果
        return ans;
    }

    /**
     * 使用回溯法生成有效的括号组合
     *
     * @param left  剩余可用的左括号数量
     * @param right 剩余可用的右括号数量
     * @param sb    当前正在构建的字符串
     */
    private void backtrack(int left, int right, StringBuilder sb) {
        // 如果左右括号都用完了,将当前组合加入结果集
        if (left == 0 && right == 0) {
            ans.add(new String(sb));
            return;
        }

        // 如果剩余左括号多于右括号,无法形成有效组合,直接返回
        if (left > right) {
            return;
        }

        // 如果左括号或右括号数量为负数,无效情况,直接返回
        if (left < 0 || right < 0) {
            return;
        }
        // 尝试添加左括号
        sb.append('(');
        backtrack(left - 1, right, sb);
        sb.deleteCharAt(sb.length() - 1); // 回溯,删除最后添加的左括号

        // 尝试添加右括号
        sb.append(')');
        backtrack(left, right - 1, sb);
        sb.deleteCharAt(sb.length() - 1); // 回溯,删除最后添加的右括号
    }
}