题目:
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个右括号,并且一个右括号必定有一个唯一对应的左括号在它左边,那么就可以用两个变量来分别记录剩余左括号的数量(L)和右括号的数量(R),如果L>R,那么就说明一个右括号出现在了其对应左括号的前面,所以只要限制这一点就能够生成合法的序列。
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
static vector<string> generateParenthesis(int n) {
vector<string> ans;
pb(ans,"",n,n);
return ans;
}
static void pb(vector<string>& v,string s,int l,int r)
{
if(l==0&&r==0)
{
v.push_back(s);
cout<<"push"<<s<<endl;
return;
}
if(l>0)
pb(v,s+'(',l-1,r);
if(l<r)
pb(v,s+')',l,r-1);
}
};
int main()
{
int n=3;
vector<string> v;
v=Solution::generateParenthesis(n);
for(int i=0;i<v.size();i++)
cout<<v[i]<<endl;
}
当L=R=0的时候说明已经生成完成,即字符串中已经含有了n个左括号和n个右括号。