考点:回溯+剪枝
思路
官方题解看不懂,参考官方题解下用户GB2312的思路:
- 括号肯定都要用完才算结束
- 左括号和右括号的数量一定相等
- 但是数量相等不一定是有效括号比如())()(
- 但是如果先有左括号,才能有右括号+左右数量相等就一定是有效括号
- 上一句话翻译后的具体操作就是如果有一个左括号就可以有一个右括号,有两个左就可以有两个右,但是有两个左不可以有三个右以此类推。
- 上一句话的代码实现方法是记左的个数为left右为right,left/right初始值为n,有:left > 0 可以使用左括号,但是left < right,才可以使用右。left=right=0为结果。
var generateParenthesis = function (n) {
const dfs = (left, right, path) => {
if (left === 0 && right === 0) {
res.push(path);
}
if (left > 0) {
dfs(left - 1, right, path + "(");
}
if (left < right) {
dfs(left, right - 1, path + ")");
}
};
const res = [];
dfs(n, n, "");
return res;
};
从代码中可以明显看出回溯的影子:由于有 2n 个左括号和右括号,所以结果字符串的长度是 2n,每一位尝试去放左括号还是右括号。要先想到回溯,然后在此基础上进行剪枝。