vector<string> generateParenthesis(int n) {
vector<string> strs;
int *A=new int[n+1];
back_track(1,n,A,strs);
return strs;
}
void back_track(int now,int n,int A[],vector<string> &strs)
{
if(now>2&&now<=n+1&&A[now-2]>=A[now-1]) return;//模拟实际情况的剪枝
if(now>n)//输出字符串
{
string s;
for(int i=1,j=1;i<=2*n;i++)
{
if(A[j]==i)
{
s+='(';
j++;
}
else {s+=')';}
}
strs.push_back(s);
return ;
}
for(int i=now;i<2*now;i++)
{
A[now]=i;
back_track(now+1,n,A,strs);
}
}
刚开始为了方便思考,首先生成了'('对于位置的数字序列,然后按照数字序列输出字符串。
此处顺便复习了回溯法,有大佬还给出了直接模拟的方法,更简洁明了。