22. 括号生成
难度中等
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
来源:添加链接描述
思路分析:
这道题就是经典的回溯算法题,相对于用循环不如直接用递归更加好写一些代码,通够分析得到,‘(’和‘)’都各有n个并且第一个出现的一定是‘(’因为要满足有效括号,所以在每次递归之前都要判断一下‘)’的个数是否要小于‘(’的个数,只有在‘)’小于‘(’的个数前提下才能输出‘)’。每次递归对于‘()’的个数都要减1,直到两个个数都减到0便结束递归。
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
class Solution
{
public:
vector<string>generateParenthesis(int n)
{
vector<string>result;
generate("", n, n, result);
return result;
}
private:
void generate(string item, int left,int right, vector<string>& result)
{
if (left==0&&right==0)
{
result.push_back(item);
return;
}
if (left > 0)
{
generate(item + ')', left-1, right,result);
}
if (right > 0&&right<=left)
{
generate(item + '(', left,right-1, result);
}
}
};
int main()
{
Solution S;
int n;
cin >> n;
vector<string>result=S.generateParenthesis(n);
for (int i = 0;i < result.size();++i)
{
cout << result[i].c_str() << endl;
}
}