生成括号串。回溯遍历。
要生成2n个括号。每次要么左括号,要么右括号。
1 左括号数<n:
a 左括号数==右括号数,可插入左括号。
b 左括号数>右括号数,可插入左括号或者右括号。
2 左括号数==n:
a 左括号数==右括号数, 有效序列生成。
b 左括号数>右括号数,插入右括号。
class Solution {
public:
void _generate(vector<string> &res,string &to_put, int left, int right,int n){
if(left==right && left==n){
res.push_back(to_put);
return;
}
if(left==n){
to_put.push_back(')');
_generate(res,to_put,left,right+1,n);
to_put.pop_back();
return;
}
if(left==right){
to_put.push_back('(');
_generate(res,to_put,left+1,right,n);
to_put.pop_back();
return;
}
to_put.push_back('(');
_generate(res,to_put,left+1,right,n);
to_put.pop_back();
to_put.push_back(')');
_generate(res,to_put,left,right+1,n);
to_put.pop_back();
return;
}
vector<string> generateParenthesis(int n) {
vector<string> res;
string to_put;
_generate(res,to_put,0,0,n);
return res;
}
};