算法学习记录(七十九)

89 阅读1分钟

22. 括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

image.png

解: 暴力解:用n个(和n个)进行全排列,然后对生成出来的全排列结果遍历一遍判断是否是有效括号组合。

回溯解:只生成有效括号,也就是在第i个位置时满足两个条件:左括号的数量一定小于等于n;右括号的数量一定小于等于左括号的数量。所以递归函数要把左括号数量和右括号数量传递下去。当左括号数量小于一半时可以选择放左括号或者右括号。那么在递归前保存str信息,选择放左括号并且递归下去,递归结束后将str信息重置为不放左括号,然后放右括号继续递归即可。

const func = (num) => {
    const res = []
    function getRes(i, leftNums, rightNums, str) {
        if (i === num * 2) {
            res.push(str)
            return
        }
        // 如果左括号数量小于一半
        if (leftNums < num) {
            const preStr = str
            // 选择放左括号
            str += '('
            getRes(i + 1, leftNums + 1, rightNums, str)
            // 选择不放左括号
            str = preStr
        }
        // 如果右括号数量小于左括号
        if (rightNums < leftNums) {
            str += ')'
            getRes(i + 1, leftNums, rightNums + 1, str)
        }
    }
    getRes(0, 0, 0, '')
    return res
}