数字n代表生成括号的对数,设计一个函数,用于能够生成所有可能的并且有效的括号组合 回溯算法
题目描述:
数字n代表生成括号的对数,设计一个函数,用于能够生成所有可能的并且有效的括号组合
如 n=2 则输出 // ['(())', '()()']
n=3 则输出 // ['((()))', '(()())', '(())()', '()(())', '()()()']
解题思路:
1.首先每个括号是成对的一个左括号和右括号两个元素组成,有效的括号即左右括号要对应
2.每放置一个左括号,便可以放置一个右括号,并且在左括号数量小于 n 时依然可以放置左括号
——左括号数量不大于 n 时可以添加左括号
——左括号数量大于右括号时可以添加右括号
3.定一个数组容器放生成的组合字符串,用初始化空字符串来写入括号
4.边界条件是左右括号数量和达到 2*n 时把字符串push()进容器数组
let generateParent = function(n){
let res = []
let handleParen = (cur, left, right) =>{
if(cur.length === 2*n) { // 满足条件时结束递归调用
res.push(cur)
return
}
if(left < n) { // 进入到这个条件的同时并不会阻塞下面的条件语句,也就是另外一种可能
handleParen(cur+"(", left +1 , right)
}
if(left > right) {
handleParen(cur + ')', left, right+1)
}
}
handleParen('',0,0) // 设置一个初始状态
return res
}
console.log(generateParent(3), 'generateParent')
在这里正好普及下回溯算法
回溯算法,也是算法设计中的一种思想,是一种渐进式寻找并构建问题解决方式的策略
回溯算法会先从一个可能的工作开始解决问题,如果不行,就回溯并选择另一个动作,直到将问题解决
使用回溯算法的问题,有如下特性:
- 有很多路,例如一个矩阵的方向或者树的路径
- 在这些的路里面,有死路也有生路,思路即不符合题目要求的路,生路则符合
- 通常使用递归来模拟所有的路