括号生成,相当于每个位置都有'(', ')'两种选择。然后是递归条件,我们用两个变量,left, right分别表示'(' , ')'已经使用的个数。如果right > left , 就说明当前使用right 多于left,这种情况是可以进行剪枝的。当left < 0 或right < 0 时,也要return, 当left和right都等于0时,这时结果保存,return.
代码如下:
class Solution {
public:
// 什么是有效的
// 回溯怎么做
// 每个位置都有两种选择: "(", ")"
// 剪枝????
vector<string> res;
vector<string> generateParenthesis(int n) {
string s;
backtrack(n, n, s);
return res;
}
// left 代表当前使用的"("个数
// right 代表 当前使用的 ")"个数
void backtrack(int left, int right, string& track){
// 这一步的剪枝非常关键
//
if(right < left){
return;
}
if(left < 0 || right < 0){
return;
}
if(left == 0 && right == 0){
res.push_back(track);
return;
}
char c = '(';
track.push_back(c);
backtrack(left-1, right, track);
track.pop_back();
c = ')';
track.push_back(c);
backtrack(left, right-1, track);
track.pop_back();
}
};