22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
解: 暴力解:用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
}