class Solution {
public:
/*
左括号不超过n个
有左才有右 右括号个数不超过左括号
开头左括号 结尾右括号
*/
vector<string> ans;
void fun(int n,int m,string &s,int left,int right) //n为回溯法里面的层数
{
if (n == (m-1))
{
s[n] = ')';
ans.push_back(s);
return;
}
else
{
//每一层只有两种选择 左括号或者右括号
if (n == 0 || left < m / 2) //左括号个数不能超标
{
s[n] = '(';
fun(n + 1, m, s, left + 1, right);
s[n] = ' ';//放完左括号之后改回来 看看房另一个右括号行不行
}
if (n > 0 && right < left) //左括号数量不能超标 右括号不能超过左括号
{
s[n] = ')';
fun(n + 1, m, s, left , right+1);
s[n] = ' ';
}
}
}
vector<string> generateParenthesis(int n)
{
string s(2 * n, ' ');
fun(0, 2 * n,s,0,0);
return ans;
}
};
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:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
解法:回溯法,每一个一个个试,不行往回返,左括号不能超过n,右括号不超过左括号。[ "((()))", "(()())", "(())()", "()(())", "()()()" ]