- 题目描述
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:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
2.解题思路
这一眼下去想到,嗯,卡特兰数。按照递归求解问题。
n个括号的组合,那么可能左边有n-i个括号,右边是i个括号的组合。
注意的是i=0的时候,左边是n-1个括号的组合,然后外面加一个括号。
按照这个思路进行递归,我们就可以得到答案了嗯
最后做一个去重的工作就可以了。
3.实现代码
class Solution {
public:
vector<string> easyP(int n){
vector<string> res;
string s;
for(int i=1;i<=n;++i){
s+='(';
}
for(int i=1;i<=n;++i){
s+=')';
}
res.push_back(s);
return res;
}
vector<string> mix(vector<string> p,vector<string> q){
vector<string> res;
for(int i=0;i<p.size();++i){
for(int j=0;j<q.size();++j){
res.push_back(p[i]+q[j]);
}
}
return res;
}
vector<string> gP(int n) {
vector<string> res;
if(n==0)
return res;
if(n==1){
res.push_back("()");
return res;
}
if(n>=2){
vector<string> t=gP(n-1);
for(int i=0;i<t.size();++i){
t[i].insert(t[i].begin(),'(');
t[i].insert(t[i].end(),')');
}
res.insert(res.end(),t.begin(),t.end());
for(int i=n-1;i>=1;--i){
t=mix(gP(i),gP(n-i));
res.insert(res.end(),t.begin(),t.end());
}
}
return res;
}
vector<string> generateParenthesis(int n){
vector <string> res=gP(n);
sort(res.begin(),res.end());
vector<string>::iterator iter;
iter = unique(res.begin(),res.end());
if(iter != res.end()){
res.erase(iter,res.end());
}
return res;
}
};