【力扣算法18】之 22. 括号生成 python

简介: 【力扣算法18】之 22. 括号生成 python

问题描述


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

示例1

输入:n = 3

输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]

示例2

输入:n = 1

输出:[“()”]

提示

  • 1 <= n <= 8

思路分析

我们可以利用回溯法生成所有可能的括号组合。由于在组合过程中,我们需要保证每个右括号都有对应的左括号,因此得到的组合都是有效的。同时,我们通过限制左括号和右括号的数量,可以确保生成的组合中左括号和右括号的数量都是正确的。最终,返回的结果列表即为所有可能的有效括号组合。

  1. 定义一个函数generateParenthesis,接收一个整数参数n,表示生成括号的对数。函数的返回值是一个字符串列表,包含所有可能的并且有效的括号组合。
  2. 创建一个空列表result,用于保存结果。
  3. 调用辅助函数backtrack,传入参数result、空字符串""、左括号的数量和右括号的数量都为0,以及目标括号对数n
  4. backtrack函数中,首先检查当前的组合长度是否达到了目标长度(2 * n)。如果是,则将当前组合添加到结果列表result中,并返回。
  5. 如果当前左括号的数量小于目标括号对数n,则可以添加一个左括号。递归调用backtrack函数,在当前组合后面添加一个左括号,并将左括号计数增加1。
  6. 如果当前右括号的数量小于当前左括号的数量,说明我们可以添加一个右括号。递归调用backtrack函数,在当前组合后面添加一个右括号,并将右括号计数增加1。
  7. 递归结束后,就可以得到所有可能的并且有效的括号组合。
  8. 返回结果列表result

代码分析

  1. generateParenthesis 方法:这个方法是对外的接口函数,接收一个整数参数 n,表示生成括号的对数。方法的返回值是一个字符串列表,包含所有可能的并且有效的括号组合。
  2. result 变量:这是一个空列表,用于保存最终的结果。
  3. backtrack方法:这是一个辅助函数,用于生成有效的括号组合。它接收五个参数:resultcurrentopen_countclose_countn
  • result:保存结果的列表。
  • current:表示当前的组合。
  • open_count:表示已经添加的左括号数量。
  • close_count:表示已经添加的右括号数量。
  • n:目标括号对数。
  1. if len(current) == 2 * n::这个条件判断用于判断当前组合的长度是否达到了目标长度,即2 * n。如果达到了目标长度,说明得到了一个有效的括号组合,将其添加到结果列表 result 中,并返回。
  2. if open_count < n::这个条件判断用于判断当前左括号的数量是否小于目标括号对数 n。如果是,则可以在当前组合后面添加一个左括号。递归调用 backtrack 函数,将当前组合 current + "("、左括号数量 open_count + 1、右括号数量 close_count 和目标括号对数 n 作为参数。
  3. if close_count < open_count::这个条件判断用于判断当前右括号的数量是否小于当前左括号的数量。如果是,则可以在当前组合后面添加一个右括号。递归调用 backtrack 函数,将当前组合 current + ")"、左括号数量 open_count、右括号数量 close_count + 1 和目标括号对数 n 作为参数。

通过以上递归和回溯的过程,可以生成所有可能的并且有效的括号组合。最终,返回结果列表 result


完整代码


class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        result = []  # 初始化结果列表,用于保存最终的括号组合
        self.backtrack(result, "", 0, 0, n)  # 调用回溯函数生成括号组合
        return result  # 返回结果列表
    def backtrack(self, result, current, open_count, close_count, n):
        if len(current) == 2 * n:  # 如果当前组合的长度达到目标长度2*n
            result.append(current)  # 将当前组合添加到结果列表中
            return  # 结束当前回溯路径
        if open_count < n:  # 如果左括号数量小于目标括号对数n
            self.backtrack(result, current + "(", open_count + 1, close_count, n)  # 在当前组合后面添加一个左括号,递归调用回溯函数
        if close_count < open_count:  # 如果右括号数量小于当前左括号数量
            self.backtrack(result, current + ")", open_count, close_count + 1, n)  # 在当前组合后面添加一个右括号,递归调用回溯函数

详细分析


  1. 方法是对外的接口函数,接收一个整数 n,代表括号对的数量。它首先初始化一个空列表 result,用于保存最终的结果。然后调用 backtrack 方法,开始递归生成括号组合。
  2. backtrack 方法是一个辅助函数,用于实现递归和回溯算法来生成所有可能的括号组合。它接收五个参数:result 用于保存结果的列表,current 当前的括号组合字符串,open_count 左括号的数量,close_count 右括号的数量,n 目标括号对的数量。
  3. 首先,在 backtrack 方法中,判断当前组合的长度是否达到目标长度(2 * n),如果是,则表示已经生成了一个有效的括号组合,将当前组合添加到结果列表 result 中,并结束当前回溯路径。
  4. 如果左括号的数量小于目标括号对数n,说明还可以添加左括号,执行以下操作:
  • 在当前组合字符串 current 的末尾添加一个左括号,表示选择了一个左括号。
  • 递归调用 backtrack 方法,并传入更新后的参数:新的组合字符串、左括号数量加一、右括号数量不变。
  1. 如果右括号的数量小于当前左括号的数量,说明还可以添加右括号,执行以下操作:
  • 在当前组合字符串 current 的末尾添加一个右括号,表示选择了一个右括号。
  • 递归调用 backtrack 方法,并传入更新后的参数:新的组合字符串、左括号数量不变、右括号数量加一。
  1. 通过递归和回溯的过程,不断生成括号组合,直到得到所有可能的并且有效的括号组合。
  2. 最终,将结果列表 result 返回作为最终的输出。

这个算法的关键在于理解递归和回溯的思想。通过不同的选择(添加左括号或右括号),生成所有可能的括号组合,并通过判断条件来确保生成的组合是有效的。递归函数在每一步都会做出选择并递归调用自身,直到满足结束条件,然后回溯到上一步,继续进行下一种选择,直到尝试完所有的选择。通过这种方式,遍历所有可能的情况,得到最终的结果。

运行效果截图

调用

solution = Solution()
n = 3
n1 = 1
print(solution.generateParenthesis(n))
print(solution.generateParenthesis(n1))

运行结果


完结


相关文章
|
11天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
144 55
|
27天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
127 67
|
27天前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
119 61
|
29天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
107 63
|
21天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
114 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
2天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
34 5
|
2天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
27 0
|
1月前
|
机器学习/深度学习 算法 大数据
蓄水池抽样算法详解及Python实现
蓄水池抽样是一种适用于从未知大小或大数据集中高效随机抽样的算法,确保每个元素被选中的概率相同。本文介绍其基本概念、工作原理,并提供Python代码示例,演示如何实现该算法。
35 1
|
1月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
84 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
1月前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
93 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型