Problem description:
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:
“((()))”, “(()())”, “(())()”, “()(())”, “()()()”
Analysis: It’s a dfs problem with backtracking .
First we need to figure out,
there are two ways to add a left or right parentheses to the current string.
If number of ( is less than n, you can add (;
If number of ) is less than number of (, you can add ).
Then we could add left or right parentheses, at each level of recursion.
codes:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
if(n==0)return res;
string s;
combine(res,s,n,0);
return res;
}
void combine(std::vector<string>& res,string s,int left,int right)
{
if(left==0&&right==0)
{
res.push_back(s);
return;
}
if(left>0)
combine(res,s+'(',left-1,right+1);
if(right>0)
combine(res,s+')',left,right-1);
}
};
slow method:
vector<string> generateParenthesis(int n) {
vector<string> res;
string s="()";
if(n==0)return res;
if(n==1)
{
res.push_back(s);
return res;
}
combine(res,n-1,s);
return res;
}
void combine(vector<string> &res,int n,string s){
//cout<<n<<" "<<s<<endl;
int i;
if(n==0){
vector<string>::iterator it=find(res.begin(),res.end(),s);
if(it==res.end())
res.push_back(s);
return;
}
int count=s.size();
vector<string> tmp;
for(i=0;i<count/2+1;i++)
{
string t=s;
t=t.insert(i,"()");
//vector<string>::iterator result = find(tmp.begin( ),tmp.end( ),t);
//if (result == tmp.end( ) )
combine(res,n-1,t);
//else continue;
}
//combine(n-1,s.insert(i,"()"));
}