给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
class Solution {
public:
vector<string> generateParenthesis(int n) {
// void generate_output(int &level,int &l,int &r,int n,vector<string> &outpout,vector<char> &temp);
vector<string> output;
int l=0;
int r=0;//l和r分别记录左括号数和右括号数;
int level=0;//树的层次;
generate_output(1,l,r,n, output ,"");
return output;
}
public:
void generate_output(int level,int l,int r,int n,vector<string> &output,string temp){
// cout<<l<<endl<<r<<endl;
//cout<<level<<endl;
// cout<<temp<<endl;
if((l==r)&&(l==n)){//此时生成的括号是有效的括号;
output.push_back(temp);
return ;
}
else if((l>n||r>n)&&(l!=n||r!=n)){//有错误的括号时也返回;
return ;
}
//插入左结点上的左符号;压入"("
generate_output(level+1,l+1,r,n, output ,temp+'(');
//cout<<l<<endl;
level--;
//插入右结点上的右符号;压入“)”
if(r<l)
generate_output(level+1,l,r+1,n, output ,temp+')');
}
};
算法思想是回溯算法思考时利用了树的思想,左边入“(”,右边入“)”,不符合条件时跳出递归,符合条件时继续或是赋值给输出项。