LeetCode刷题笔记--22. Generate Parentheses

22. Generate Parentheses

Medium

2514153FavoriteShare

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

这道题有点难,刚开始没有什么思路,后来想到一种办法,就是一个一个写进去,如何写呢?第一个只能写左括号,第二个可以写左括号和右括号,也就是说选择哪种括号的条件是:

1.当没有任何括号时写左括号

2.当左括号的数量大于右括号,并且左括号还没有写完时,既可以写左括号,又可以写右括号(此时的数量会增加1)

3.当左括号的数量大于右括号,并且左括号已经用完时,必须写右括号

4.当左括号的数量等于右括号,并且左括号没有用完时,只能写左括号

应该只有上述四种情况。

AC代码如下:

PS:写的时候注意,vector中不能同时包含不同类型的数据,比如vector[1][0]是string, vector[1][1]是int,这种是不行的。因此必须使用结构体。

class Solution {
public:
    struct vv
    {
        string ss;
        int a;//左括号个数
        int b;//右括号个数
    };

    vector<string> generate(int m)
    {
        vector<vv> aa;
        vector<vv> tt;//temp aa
        string s;
        int n = m / 2;

        s = "(";
        aa.push_back({ s,1,0 });
        m--;

        while (m > 0)
        {
            int sz=aa.size();//这一句特别重要,必须先把size取出来,不然在加入一组新数据后,size就会多出来,就不对了。做出来的括号有问题。
            for (int i = 0; i < sz; i++)
            {
                if (aa[i].a > aa[i].b&&aa[i].a < n)
                {
                    aa.push_back({ aa[i].ss + ")",aa[i].a,aa[i].b+1 });
                    aa[i].ss += "(";
                    aa[i].a++;
                    //break;
                }
                else if (aa[i].a > aa[i].b&&aa[i].a == n)
                {
                    aa[i].ss += ")";
                    aa[i].b++;
                }
                else if (aa[i].a == aa[i].b&&aa[i].a <= n)
                {
                    aa[i].ss += "(";
                    aa[i].a++;
                }
            }

            m--;
        }
        vector<string> ans;
        ans.clear();
        for (int i = 0; i < aa.size(); i++)
        {
            ans.push_back(aa[i].ss);
        }
        return ans;

    }

    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        ans.clear();
        if (n == 0)
        {
            ans.push_back("");
            return ans;
        }
        return generate(n * 2);
    }
};

猜你喜欢

转载自blog.csdn.net/vivian0239/article/details/89021850
今日推荐