# 22 括号生成

# 题目链接

# 难度:中等

# 思路分析:

树思想 回溯

#

#

#

#

#

#

#

#

#

#

#

#

#

#

# 代码:

树思想 回溯 深度优先遍历

var generateParenthesis2 = function(n) {
	let left = (right = n) // 左右分支的数量
	let res = []
	if (n == 0) {
		return res
	}
	dfs('', left, right)
	function dfs(preStr, left, right) {
		// 当没有括号时 即回溯终止
		if (left === 0 && right === 0) {
			res.push(preStr)
			return
		}
		// 当成一颗深度为2n的树来做 每个括号在这棵树内都会都用到
		// 剪枝: 左括号可以使用的个数严格大于右括号可以使用的个数时 左侧也会生出分支准备生出右侧的括号
		if (left > right) {
			return
		}
		// 一次添加左侧一次添加右侧 回溯 凑成括号
		if (left > 0) {
			dfs(`${preStr}(`, left - 1, right)
		}
		if (right > 0) {
			dfs(`${preStr})`, left, right - 1)
		}
	}
	return res
}
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

回溯加法方式 深度优先遍历

var generateParenthesis3 = function(n) {
	let res = []
	dfs('', 0, 0)
	function dfs(preStr, left, right) {
		// 括号数量用完了 取消回溯
		if (left === n && right === n) {
			res.push(preStr)
			return
		}
		// 当左边的数量小于右边时 左侧也会生出分支准备生出右侧的括号
		if (left < right) {
			return
		}
		// 一次添加左侧一次添加右侧 回溯 凑成括号
		if (left < n) {
			dfs(`${preStr}(`, left + 1, right)
		}
		if (right < n) {
			dfs(`${preStr})`, left, right + 1)
		}
	}
	return res
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 鼓励我一下:

觉得还不错的话,给我的项目点个star

# 点个Star支持我一下~