leetcode-括号生成

括号生成(难度:中等)

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

输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

这道题的比较好的解法就是深搜+回溯的算法。我们设置一个path用于保存路径,那么递归的终点就显而易见了:当path的长度为n的两倍,那么这个时候就代表已经找出了一条符合要求的解,直接保存下来就可以了。

当path长度小于n的两倍,说明还可以往里面放括号,这个时候有两种情况,左括号的数量小于n,说明这个时候还可以继续放左括号。第二种情况,右括号的数量小于左括号的数量,说明这个时候可以放右括号。需要注意的是,这两种情况不是互斥的,而是需要顺序执行

那么我们就可以对放左括号和右括号进行递归,为了实现回溯,我们每一次递归完,都需要回退当前情况下的path和左右括号的放置情况

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var generateParenthesis = function(n) {
let res = [],
arr = new Array(n)

for(let i = 0; i < n; i++){
arr[i] = '('
}
dfs(n, res, [], [], [])
return res.map(v => {
return v.join('')
})
};
function dfs(n, res, path, left, right){
if(path.length === n * 2){
res.push(JSON.parse(JSON.stringify(path)))
return 0
}
if(left.length < n){
path.push('(')
left.push('(')
dfs(n, res, path, left, right)
path.pop()
left.pop()
}
if(right.length < left.length){
path.push(')')
right.push(')')
dfs(n, res, path, left, right)
path.pop()
right.pop()
}

}
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2021 AURORA_ZXH
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信