回溯算法解括号生成
#回溯算法
力扣第 22 题「括号生成」
输入是一个正整数 n
,输出是 n
对儿括号的所有合法组合
n
代表括号的对数
比如说,输入 n=3
,输出为如下 5 个字符串:
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
代码如下:
var generateParenthesis = function (n) {
let track = "";
let res = [];
const backtrack = (left, right) => {
// 若左括号剩下的多,说明不合法
if (right < left) return;
// 数量小于 0 肯定是不合法的
if (left < 0 || right < 0) return;
// 当所有括号都恰好用完时,得到一个合法的括号组合
if (left === 0 && right === 0) {
res.push(track);
return;
}
// 做选择,尝试放一个左括号
track += "(";
backtrack(left - 1, right);
// 撤销选择
track = track.slice(0, -1);
// 做选择,尝试放一个右括号
track += ")";
backtrack(left, right - 1);
// 撤销选择
track = track.slice(0, -1);
};
backtrack(n, n);
return res;
};