法一、
观察n与n-1时的情况,找到新括号添加的位置,观察发现,n是在n-1的每个空白位置都加一对括号,最后将所有情况中重复的去掉后得到的。
法二、
递归,n有n个左括号,n个右括号,一共2n个,生成时,要保证当前位置左边的右括号个数<=左括号,(若右括号>左括号,左边会出现))(类似情况)用left和right来表示剩余的左括号和右括号。
1、若left>right,说明当前位置左侧右括号多于左括号,不继续处理
2、若left==0&&right==0,说明所有的左右括号都被放入其中,将该结果保留
3、若left>0,调用函数,要更改参数
right>0,调用函数,要更改参数
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
generate(n,n,"",res);
return res;
}
void generate(int left,int right,string s,vector<string> &res){
if(left>right) return ;
if(left==0&&right==0){
res.push_back(s);
}
else{
if(left>0){
generate(left-1,right,s+"(",res);
}
if(right>0){
generate(left,right-1,s+")",res);
}
}
}
};