可视化图解算法59:括号生成

牛客网 面试笔试 TOP101    |     LeetCode 22. 括号生成正数

1. 题目

描述

给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。

例如,给出n=3,解集为:

"((()))", "(()())", "(())()", "()()()", "()(())"

数据范围:0 ≤n≤10

要求:空间复杂度 O(n),时间复杂度 O(2n)

示例1

输入:

1

返回值:

["()"]

示例2

输入:

2

返回值:

["(())","()()"]

2. 解题思路

括号的生成可以使用回溯算法完成,结合回溯算法模板,对应的思路如下:

回溯算法模板

59-1

在此过程要特别注意:左括号进行处理节点递归回溯,右括号也需要进行相同的操作。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

3. 编码实现

核心代码如下:

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param n int整型
 * @return string字符串一维数组
 */
func generateParenthesis(n int) []string {
	// write code here
	result = make([]string, 0)
	backtracking("", 0, 0, 2*n)
	return result
}

func backtracking(current string, left int, right int, max int) {
	if len(current) == max {
		//2.1 存放结果
		result = append(result, current)
		//2.2 返回
		return
	}

	//1.选择:在本层集合中遍历元素
	//1.1 如果左括号数量小于n,可以尝试添加一个左括号
	if left < max/2 {
		//1.1.1 处理节点(添加一个左括号)
		current = current + "("
		// 1.1.2 递归(尝试再次添加括号)
		backtracking(current, left+1, right, max)
		//1.1.3 回溯,撤销选择(移除刚刚添加的左括号)
		current = current[:len(current)-1]
	}
	//1.2 如果右括号数量小于左括号数量,可以尝试添加一个右括号
	if right < left {
		//1.2.1 处理节点(添加一个右括号)
		current = current + ")"
		// 1.2.2 递归(尝试再次添加括号)
		backtracking(current, left, right+1, max)
		//1.2.3 回溯,撤销选择(移除刚刚添加的右括号)
		current = current[:len(current)-1]
	}
}

var result []string

具体完整代码你可以参考下面视频的详细讲解。

4.小结

括号的生成可以使用回溯算法完成。n对括号,也就是说左右括号数 max = 2*n。先尝试放置左括号(放置的条件是:左括号的数量小于max/2)。再尝试放置右括号(放置的条件是:右括号的数量小于等于左括号的数量)。

分割线

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

  ✅   链表

  ✅   二叉树

  ✅   二分查找、排序

  ✅   堆、栈、队列

  ✅   回溯算法

  ✅   哈希算法

  ✅   动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:水有源,故其流不穷;木有根,故其生不穷。

posted @ 2025-09-04 16:59  好易学数据结构  阅读(30)  评论(0)    收藏  举报