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);
}
};