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:
int len;
vector<string>result;
string tempresult="";
vector<string> generateParenthesis(int n) {
len=n*2;
dfs(0);
return result;
}
bool istrue(string s){
int cnt=0;
for(int i=0;i<len;i++){
if(s[i]=='(')
cnt++;
else
cnt--;
if(cnt<0)
return false;
}
if(cnt==0)
return true;
return false;
}
void dfs(int index){
if(index==len){
if(istrue(tempresult))
result.push_back(tempresult);
return;
}
tempresult+='(';
dfs(index+1);
tempresult.pop_back();
tempresult+=')';
dfs(index+1);
tempresult.pop_back();
}
};
优化:在递归生成可能序列的时候就进行判断,即剪枝,‘ l ’即为tempresult中尚没有配对的‘(’的数量
class Solution {
public:
int len,l,x;
vector<string>result;
string tempresult="";
vector<string> generateParenthesis(int n) {
len=n*2;x=n;
dfs(0);
return result;
}
void dfs(int index){
if(l==0&&index==len){
result.push_back(tempresult);
return;
}
if(l<0||l>x||index==len)
return;
tempresult+='('; l++;
dfs(index+1);
tempresult.pop_back(); l--;
tempresult+=')'; l--;
dfs(index+1);
tempresult.pop_back(); l++;
}
};