function generateParenthesis(n: number): string[] {
    const ans: string[] = [];
    const dfs = (s: string, open: number, close: number) => {
        if (open === n && close === n) {
            ans.push(s);
            return;
        }

        if (open < n) {
            dfs(s + "(", open + 1, close);
        }

        if (close < open) {
            dfs(s + ")", open, close + 1);
        }
    };

    dfs("", 0, 0);
    return ans;
};