22. 括号生成

128 阅读1分钟

22. 括号生成

回溯算法

就是不停选括号,要么选左括号,要么选右括号。

当剩下的)(多时,才可以选),否则,)不能选,选了就非法。

回溯算法三步骤:

选择

  1. 在这里,每次最多两个选择,选左括号或右括号,选择会展开出一棵解的空间树。
  2. 用 DFS 遍历这棵树,找出所有的解,这个过程叫回溯。 约束条件
  3. 就是什么情况下可以选左括号,什么情况下可以选右括号。
  4. 利用约束做剪枝,就是去掉不会产生解的选项,剪去不会通往合法解的分支。
  5. 比如(),现在左右括号各剩一个,再选)就成了()),很明显这种是不合法的
if (left < right) { // 右括号剩的比较多,才能选右括号
     dfs(left, right - 1, str + ")");
}

目标

  1. 构建出一个用尽n对括号的合法括号串。
  2. 意味着,当构建的长度达到 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;
};

堆排序 (1).jpg