class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return string字符串vector
     */
    
    vector<string> ans;
    string temp;
    int left = 0;
    int right = 0;
    vector<string> generateParenthesis(int n) {
        left = right = n;
        dp();
        return ans;
    }

    void dp(){
        if(left == 0 && right ==0){   //终止条件
            ans.push_back(temp);
            return;
        }

        if(left >0){  //添加左括号;
            temp.push_back('(');
            left--;
            dp();
            temp.pop_back();
            left++;
        }

        if(right >0 && right >left){   
            //用左右括号的剩余关系来限制右括号的添加,右括号的剩余必须大于左括号的剩余才能添加;
            temp.push_back(')');
            right--;
            dp();
            temp.pop_back();
            right++;
        }

    }
};