k代表 ”(“ 的数量
如果字符串长度等于2n且栈为空,则增加一个答案
如果"("的数量大于n或者字符串长度大于2n,则退出
接着就是dfs过程
先放'('
dfs
然后拿出'('
接着若栈顶满足条件,则放")"
然后dfs
void dfs(stack<char> str_stack,string str,int k,vector<string> &ans,int n)
{
string str_temp=str;
if(str.size()==2*n && str_stack.empty())
{
ans.push_back(str);
return ;
}
if(k>n||str.size()>2*n)
return ;
//选用(
str+='(';
str_stack.push('(');
dfs(str_stack,str,k+1,ans,n);
//取消'(',变回去
str=str_temp;
str_stack.pop();
//若栈顶是(,选用)
if(!str_stack.empty()&&str_stack.top()=='(')
{
str+=')';
str_stack.pop();
dfs(str_stack,str,k,ans,n);
}
}
vector<string> generateParenthesis(int n)
{
string str="";
stack<char> str_stack;
vector<string> ans;
dfs(str_stack,str,0,ans,n);
return ans;
}