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:
"((()))", "(()())", "(())()", "()(())", "()()()"
class Solution {
public:
/*algorithm , DFS
brute force
generate all pairs,for each, check its valid
*/
bool validPair(string s){
stack<char>stk;
for(int i = 0;i < s.size();i++){
if(s[i] == '(')stk.push('(');
else{
if(stk.empty() || stk.top() != '(')
return false;
stk.pop();
}
}
return stk.empty();
}
void dfs(vector<string>&pairs,string pair,int n){
if(pair.size()==n){
if(validPair(pair))pairs.push_back(pair);
return;
}
string symbol[2]={"(",")"};
for(int i = 0;i < 2;i++){
if(pair.empty() && symbol[i]==")")continue;
dfs(pairs,pair+symbol[i],n);
}
}
vector<string> generateParenthesis(int n) {
vector<string>pairs;
dfs(pairs,"",n*2);
return pairs;
}
};
class Solution {
public:
/*algorithm , DFS
before add ")" and "(",keep cnt("(") >= cnt(")")
*/
void dfs(vector<string>&pairs,string pair,int n,int lcnt,int rcnt){
if(pair.size()==(2*n)){
pairs.push_back(pair);
return;
}
if(lcnt < n){
dfs(pairs,pair+"(",n,lcnt+1,rcnt);
}
if(lcnt > rcnt){
dfs(pairs,pair + ")",n,lcnt,rcnt+1);
}
}
vector<string> generateParenthesis(int n) {
vector<string>pairs;
dfs(pairs,"(",n,1,0);
return pairs;
}
};