这道题还挺好的,有一点意思。
一共有两个候选的元素,每个候选元素最多可以用n次,他们两个之间还有个限制条件是要加入右括号必须要求未匹配的左括号数大于0才行。通过这些应该已经有思路了,递归的时候,每次都可以由两种选择,要么在下个位置上放左括号,要么放右括号,需要记录两个量,一个是一共放了多少个左括号了,另一个是当前未匹配的左括号有多少个。这样,当未匹配的左括号数大于0时,才可以继续放右括号,也就是右括号的数量一定不会大于左括号的数量,不需要保存它的个数。
这种题目,代码总是比语言更好理解。
void generateAll(int left, int hleft, int n, int pos, string &pres, vector<string> &res){
if(pos == 2*n){
res.push_back(pres);
//cout<<pres<<endl;
return;
}
for(int i=0;i<2;i++){
if(i==0&&hleft<n){
pres[pos] = '(';
generateAll(left+1, hleft+1, n, pos+1, pres, res);
}else if(i==1&&left>0){
pres[pos] = ')';
generateAll(left-1, hleft, n, pos+1, pres, res);
}
}
}
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
if(n<=0)
return res;
string pres(2*n, '#');
generateAll(0, 0, n, 0, pres, res);
return res;
}
};