方法一:
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return string字符串vector
     */
    void dfs(vector<string>& v, string str, string str_l,string str_r, int n)
    {
        if(str_l.size()==n && str_r.size()==n)
        {
            v.emplace_back(str);
            return;
        }
       
        if(str_l.size()<n)
            dfs(v,str+"(",str_l+"(",str_r,n);

       
        if(str_r.size()<n && str_l.size()>str_r.size())
            dfs(v,str+")",str_l,str_r+")",n);
    }

    vector<string> generateParenthesis(int n) {
        // write code here
        vector<string> v;
        string str = "";
        string str_l = "";
        string str_r = "";

        dfs(v,str,str_l,str_r,n);

        return v;
    }
};


方法二:
class Solution {
public:
    void recursion(int left, int right, string temp, vector<string> &res, int n){
        //左右括号都用完了,就加入结果
        if(left == n && right == n){ 
            res.push_back(temp);
            return;
        }
        //使用一次左括号
        if(left < n) 
            recursion(left + 1, right, temp + "(", res, n);
        //使用右括号个数必须少于左括号
        if(right < n && left > right) 
            recursion(left, right + 1, temp + ")", res, n);
    }
    
    vector<string> generateParenthesis(int n) {
        //记录结果
        vector<string> res; 
        //记录每次组装的字符串
        string temp; 
        //递归
        recursion(0, 0, temp, res, n); 
        return res;
    }
};


方法三:将方法一中的str_l和str_2换成stack<char>类型,好像就不行了,看来stack作为形成有点像引用一样,加了元素进栈会影响后续的回溯;