括号生成-递归回溯

本文详细介绍了括号生成算法的实现思路与递归方法。通过递归与回溯技巧,确保左右括号正确配对,生成所有可能的有效括号组合。文章提供了具体的Python代码示例,便于读者理解和实现。

括号生成-牛客

思路

  • 递归
    1)终止条件: 左右括号都使用了n个,将结果加入数组。
    2)返回值: 每一级向上一级返回后续组装后的字符串,即子问题中搭配出来的括号序列。
    3)本级任务: 每一级就是保证左括号还有剩余的情况下,使用一次左括号进入子问题,或者右括号还有剩余且右括号使用次数少于左括号的情况下使用一次右括号进入子问题。
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param n int整型 
# @return string字符串一维数组
#
class Solution:
    def generateParenthesis(self , n: int) -> List[str]:
        # 递归与回溯
        res=list()
        temp=""
        #递归
        self.recursion(0, 0, temp, res, n)
        return res
    
    def recursion(self, left, right, temp, res, n):
        #左右括号都用完了,加入结果数组
        if left==n and right==n:
            res.append(temp)
            return
        #左括号使用次数小于n,使用一次左括号
        if left < n:
            self.recursion(left+1, right, temp+"(", res, n)
        #右括号使用次数小于n且右括号使用次数小于左括号,使用一次右括号
        if right < n and left > right:
            self.recursion(left, right+1, temp+")", res, n)
        
### 递归回溯的原理 递归回溯一般借用递归来实现回溯搜索,其原理基于深度优先搜索(DFS)。回溯就是让计算机自动搜索,碰到符合的情况就结束或者保存起来;在一条路径上走到尽头也不能找出解,就回到原来的岔路口,选择一条以前没有走过的路继续探测,直到找到解或者走完所有路径为止。进行回溯搜索会有一系列步骤,每一步进行查找,除输入不同外,其他情况一致,满足递归调用需求。通过把递归结束的条件设置到搜索的最后一步,利用递归特性回溯,合法的递归调用会回到上一层调用,在回溯搜索中即回到前一个步骤。当当前步骤找不到符合条件的情况,后续情况不用考虑,让递归调用返回上一层继续找未尝试过的情况,有时为正常继续搜索,需恢复以前的调用环境 [^1]。 回溯法的基本原理也是深度优先搜索,即尽可能深地搜索每一个图。基本思想是首先访问图中的某一初始顶点 v,然后从 v 出发,访问相邻点 w1,再访问 w1 的相邻点 w2,重复上述过程。当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接点未被访问,则从该点开始继续上述搜索过程,直到图中所有点均被访问过 [^2]。 回溯算法实际上是一个类似枚举的搜索尝试过程,主要在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径 [^3]。 ### 递归回溯的应用 递归回溯在很多领域都有应用,如在图的遍历中,使用回溯法可以按照深度优先的顺序访问图中的所有节点;在算法竞赛(如 ACM)中,用于解决各种搜索类问题;在求解组合、排列等问题时也经常会用到递归回溯的思想。 ### 递归回溯的示例 #### 递归示例 以下是一个简单的递归代码示例,用于回顾递归: ```java public class RecursionExample { public static void main(String[] args) { test(4); } public static void test(int n) { if (n > 2) { test(n - 1); } System.out.println("n=" + n); } } ``` 在这个示例中,`test` 方法不断调用自身,直到 `n` 不大于 2 时停止递归调用,然后依次输出 `n` 的值 [^4]。 #### 回溯示例(生成括号问题) 回溯算法可以用于解决生成括号问题。例如,要生成所有可能的、有效的 n 对括号组合。 ```python def generate_parenthesis(n): result = [] def backtrack(s='', left=0, right=0): if len(s) == 2 * n: result.append(s) return if left < n: backtrack(s + '(', left + 1, right) if right < left: backtrack(s + ')', left, right + 1) backtrack() return result # 调用示例 print(generate_parenthesis(3)) ``` 在这个示例中,`backtrack` 函数是一个回溯函数。通过递归调用 `backtrack` 函数,不断尝试添加左括号和右括号,当生成的字符串长度达到 2 * n 时,说明已经生成了一个有效的括号组合,将其添加到结果列表中。如果左括号的数量小于 n,则可以添加左括号;如果右括号的数量小于左括号的数量,则可以添加右括号 [^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值