这道题要生成所有合法的括号情况,可以看到n的数值范围在[1,8]非常小,所以可以一个一个的搜索。
第一种是用DFS把每种情况都搜索一波,留下合法的所有情况
var generateParenthesis = function(n) {
// DFS回溯思路
// 每次添加一个括号,左边和右边,其实这个题目的难点就在于建模
let res = []
dfs(0,0,"")
return res
function dfs(open,close,cur){
// 特判不满足条件的
if( open > n || close > n || close > open ){
return
}
if(open === n && close === n){
res.push(cur)
return
}
// 用左和右来区分其实就相当于push--pop
curLeft = cur + '('
dfs(open+1,close,curLeft)
curRight = cur + ')'
dfs(open,close+1,curRight)
}
};
第二种是用BFS进行搜索,然后用Set的数据结构来去重
var generateParenthesis = function(n) {
// 思路是从开始往后面不断的去推导
let set = new Set(['()'])
// 有几个括号就循环几次
// 最开始已经初始化过了
for(let i=2;i<=n;i++){
let nextSet = new Set()
// 取set中的元素来做的
for(let s of set){
for(j=0;j<s.length;j++){
nextSet.add(s.slice(0,j) + '()' + s.slice(j))
}
}
set = nextSet
}
// 这里表示全部展开
return [...set]
};