# 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
 
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
 
提示:
以下错误的选项是?
## aop
### before
```cpp
#include 
using namespace std;
```
### after
```cpp
int main()
{
    Solution sol;
    int n = 3;
    vector res;
    res = sol.generateParenthesis(n);
    for (auto i : res)
        cout << i << endl;
    return 0;
}
```
## 答案
```cpp
class Solution
{
public:
    vector generateParenthesis(int n)
    {
        vector ans;
        string s;
        back(0, 2 * n, 0, 0, s, ans);
        return ans;
    }
    void back(int left, int right, int l_n, int r_n, string &s, vector &ans)
    {
        if (r_n > l_n || l_n > right)
            return;
        if (left == right)
        {
            ans.push_back(s);
            return;
        }
        s += '(';
        l_n++;
        left++;
        back(left, right, l_n, r_n, s, ans);
        s.erase(s.end() - 1);
        l_n--;
        s += ')';
        r_n++;
        back(left, right, l_n, r_n, s, ans);
        s.erase(s.end() - 1);
        r_n--;
    }
};
```
## 选项
### A
```cpp
class Solution
{
public:
    void generateParenthesis(string i, int left, int right, vector &output)
    {
        if (left == 0 && right == 0)
        {
            output.push_back(i);
            return;
        }
        if (left > 0)
        {
            generateParenthesis(i + '(', left - 1, right, output);
        }
        if (left < right)
        {
            generateParenthesis(i + ')', left, right - 1, output);
        }
    }
    vector generateParenthesis(int n)
    {
        string s = "";
        vector output;
        generateParenthesis(s, n, n, output);
        return output;
    }
};
```
### B
```cpp
class Solution
{
public:
    vector res;
    void backtrack(int n, int key, string cur)
    {
        if (key < 0 || key > n)
            return;
        if (cur.size() == 2 * n)
        {
            if (key == 0)
                res.push_back(cur);
            return;
        }
        backtrack(n, key - 1, cur + ')');
        backtrack(n, key + 1, cur + '(');
    }
    vector generateParenthesis(int n)
    {
        if (n == 0)
            return vector{""};
        string cur("(");
        backtrack(n, 1, cur);
        return res;
    }
};
```
### C
```cpp
class Solution
{
public:
    vector generateParenthesis(int n)
    {
        vector res;
        dfs("", 0, n, &res);
        return res;
    }
    void dfs(const string &path, int m, int n, vector *res)
    {
        if (m == 0 && n == 0)
        {
            if (!path.empty())
                res->push_back(path);
            return;
        }
        if (n > 0)
            dfs(path + '(', m + 1, n - 1, res);
        if (m > 0)
            dfs(path + ')', m - 1, n, res);
    }
};
```