题解
这个思路绝了
递归
利用剩余的左括号数和右括号数
当左括号数和右括号都为0时,那么存在一个正确组合
那么正确组合的条件有哪些呢
(1)剩余的左右括号相同,那么只能放置左括号,不能放置右括号
(2)剩余的左括号小于右括号,那么既可以放置左括号 也可以放置右括号,那么先放置左括号,注意放置的时候注意长度,不要忘了剩余的左括号不能小于零
然后也可以进行放置右括号,放置右括号不需要满足什么条件,因为前面已经有了大条件,即左括号的剩余数小于右括号的剩余数
(3)剩余的左括号 大于右括号 那么一定没有符合条件的,即不会成立。
代码
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string>res;
if(n <= 0){
return res;
}
getParenthesis(res,"",n,n);
return res;
}
void getParenthesis(vector<string>& res,string str,int left,int right){
if(left == 0 && right == 0){
res.push_back(str);
return;
}
if(left == right){
//如果剩余的左右括号数相等,那么下一个只能用左括号
getParenthesis(res,str+"(",left-1,right);
}else if(left < right){
//如果剩余左括号小于右括号,下一个可以用左括号也可以用右括号
if(left > 0){
getParenthesis(res,str+"(",left-1,right);
}
getParenthesis(res,str + ")",left,right-1);
}
}
};