题目如下:
解题思路:
递归 + 剪枝,当左边括号大于等于右边括号数量时就可以继续往下递归,否者直接结束该部分的递归调用。左括号用 left 表示剩余数量,右括号用 right 表示剩余数量。递归结束的条件:
- 一种是结果错误,当 right > left / right > n / left > n ,之后结束递归。
- 一种是结果正确正确的,当 left == 0 && right == 0 ,之后push_back当前括号字符串即可。
代码如下:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> List;
generate(n, 0, 0, "", List);
return List;
}
void generate(int n, int left, int right, string str, vector<string> &L)
{
if(left > n || right >n || right > left) //递归结束的条件
return ;
else if(left == n && right == n) //加入队列
L.push_back(str);
else{
generate(n, left+1, right, str+'(', L);
generate(n, left, right+1, str+')', L);
}
}
};