回溯算法
就是不停选括号,要么选左括号,要么选右括号。
当剩下的)比(多时,才可以选),否则,)不能选,选了就非法。
回溯算法三步骤:
选择
- 在这里,每次最多两个选择,选左括号或右括号,
选择会展开出一棵解的空间树。 - 用 DFS 遍历这棵树,找出所有的解,这个过程叫回溯。 约束条件
- 就是什么情况下可以选左括号,什么情况下可以选右括号。
- 利用约束做
剪枝,就是去掉不会产生解的选项,剪去不会通往合法解的分支。 - 比如
(),现在左右括号各剩一个,再选)就成了()),很明显这种是不合法的
if (left < right) { // 右括号剩的比较多,才能选右括号
dfs(left, right - 1, str + ")");
}
目标
- 构建出一个用尽n对括号的合法括号串。
- 意味着,当构建的长度达到 2*n,返回结果
var generateParenthesis = function (n) {
var res = [];
var dfs = (left, right, str) => {
if (str.length == 2 * n) {
res.push(str);
return;
}
if (left > 0) {
dfs(left - 1, right, str + "(");
}
if (left < right) {
dfs(left, right - 1, str + ")");
}
};
dfs(n, n, "");
return res;
};