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:
"((()))", "(()())", "(())()", "()(())", "()()()"
Subscribe to see which companies asked this question
分析:
利用回溯算法进行寻找,当不满足符号负责时回退上一层。我现在对回退的认识是,回退是自动的,不需要写代码区控制。
代码:
class Solution {
public:
bool check(string s,int n)
{
stack<char> s1;
for(int i=0;i<s.size();++i)
switch(s[i])
{
case'(':{s1.push(s[i]);break;}
case')':{if(s1.empty()|| s1.top()!='(') return false;s1.pop();break;}
}
if(s.size()==n) return s1.empty();
else return true;
}
void generate(string s1,int n, vector<string> &v1)
{
if(s1.size()==n) {v1.push_back(s1);}
else
{
if(check(s1+'(',n)) generate(s1+'(',n,v1);
if(check(s1+')',n)) generate(s1+')',n,v1);
}
}
vector<string> generateParenthesis(int n) {
vector<string> v1;
if(n==0) return v1;
generate("",2*n,v1);
return v1;
}
};
改进版写法,代码:
class Solution {
private:
void findPair(vector<string>&ans,string s1,int t,const int num){
if(s1.size()==num*2 || (t>(num))){
if(t==0){
ans.push_back(s1);
}
return ;
}
else{
if(t==0){
findPair(ans,s1+'(',t+1,num) ;
}
else{
findPair(ans,s1+"(",t+1,num) ;
findPair(ans,s1+")",t-1,num) ;
}
return ;
}
}
public:
vector<string> generateParenthesis(int n) {
vector<string> ans;
if(n==0){
return ans;
}
string s1="(";
findPair(ans,s1,1,n);
return ans;
}
};