递归+回溯解决有效括号问题

news/2024/9/28 13:28:13

题目描述:

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

例如:当n=1 时,有效的括号组合['()']

       当n=2时,有效的括号组合['(())','()()']当n=3时,有效的括号组合有['((()))','(()())','(())()'.'()(())','()()()']

解题思路:先递归生成n个左括号(,再递归生成n个右括号),之后回溯到两个左括号((, 一个左括号(,回溯的过程有点类似深度优先遍历,先遍历完左子树入栈,再根据栈顶元素(出栈的元素)访问其右子树节点,知道所有的结点都遍历完成。

核心代码:

闲来无事,一直想把递归的详细过程写一遍,正好趁这次机会,将上述代码的执行过程写在了下方。

运行过程:

(数字表示的是给递归次序标上序号,方便观察,退栈到第几次递归。)

左括号一直到((( 三次递归 123

之后进入第二个if条件,))) 三次递归 456

此时满足出口条件:输出((()))

之后递归函数出栈,执行ss.delete(ss.length()-1) 此时ss=((()),一直退完第二次的三次递归,退456,ss的结果为(((

此时开始退第一个的3递归,执行ss.deletecharat(ss.length-1),结果为((,后接着判断第二个if条件,成立,追加一个),ss=((), 入栈一次7递归(下一条是第二个if的ss.delete语句),第一个if条件成立,追加一个左括号,ss=(()(, 入栈一个8递归(下一条是第一个if的ss.delete语句),此次递归判断第一个if不满足,满足第二个if,ss追加,ss=(()(),进入一个9递归语句(下一条是第二个if条件的ss.delete),此次递归进入第二个if条件,ss=(()()), 此时进入右一个10递归(下一条是第二个if条件的ss.length-1),此次递归满足出口,输出ss(()())

开始退栈:ss的变化:(()())->(()()->(()(->(() 到第8个递归这里,因为rightBracket<LeftBracket,

进入第二个if条件,ss追加),ss=(()),进入第11个递归(下一条语句是第二个if条件的ss.delete语句),此次递归满足第一个if语句,ss追加(,值为(())(,进入递归12(下一条是第一个if条件的ss.deletechar语句),此次递归进入第二个if判断条件,ss追加),结果为(())(),

进入第13个递归,此时递归满足出口条件,输出结果(())()

开始退栈:ss的变化:(())()->(())(->(())->(()->((,退到第2个递归,ss结果为((,接着进入第二个if条件判断,ss追加),结果为((),进入第14个递归(下一条是第二个if判断条件的ss.delete语句),此次递归进入第一个if判断条件,ss追加(,ss结果为(()(,进入第15个递归(下一条是从第一个if条件下的ss.delete语句),此次递归进入第二个if判断条件下,ss追加),ss结果为(()(),进入第16次递归(下一条从第二个ss.delete开始),此次递归进入第二个if判读,ss追加),结果为(()()),进入第17次递归,此次递归满足出口条件,输出结果(()())

开始退栈:ss变化(()())->(()()->(()(->(()->(:推到第1个递归,第一个if条件的ss.delete执行后,ss结果为(,此时程序进入第二个if判断条件,ss追加(),进入第18个递归(下一条语句是第二个if条件的ss.delete语句),进入第一个if判断条件,ss追加(,值为()(,

进入第19个递归(下一条语句是第一个if判断条件下的ss.delete语句),此时递归进入第一个if条件语句,ss追加(,值为()((,进入第20个递归(下一条语句是第一个if判断条件下的ss.delete语句),此次递归进入第二个if判断条件,ss追加),值为()((),进入第21个递归(下一条语句是第二个if判断条件下的ss.delete语句),此次递归进入第二个if判断条件,ss追加),值为()(()),进入第22次递归,此次递归满足出口条件,输出结果()(())。

第22次执行结果,返回,开始退栈,返回到第17次递归继续执行,ss结果为()((),第21次结束,返回到20次递归继续执行,结果为()((, 返回到第19次递归,执行deletechar结果为()(,此时进入第二个if条件,ss追加),结果为()(),进入第23次递归(下一条是第二个if的ss.delete语句),此次递归进入第一个if判断条件,ss追加(,ss结果为()()(,进入第24次递归,此次递归进入第二个if判断条件,ss追加),ss值为()()(),进入第25次递归,此次递归正好满足出口,输出结果()()()
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/caixiaoshu/article/details/138716923

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30272.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

正义使者其二

大赢特赢,最正义的一集!\(\Huge{还有体活\,赢!}\)

..\HAL_LIB\Inc\stm32l4xx_hal_rcc_ex.h(2424): error: #20: identifier HAL_StatusTypeDef is undefined

stm32工程编译时遇到这个错误,显示HAL_StatusTypeDef没有被定义,但是go to definition又能找到定义 后来在网上寻找解决办法,结果发现竟然是 #include "stm32l4xx_hal_spi.h"#include "stm32l4xx_hal.h" 这两个的顺序问题,#include "stm32l4xx_h…

LOTO示波器动作编程功能(命令批处理)

动作编程功能是为了方便客户根据自己的应用场景,做到一个按键就连续做多个示波器操作,从而降低了对操作人员的技术要求,做到傻瓜式操作。之前LOTO有个类似的功能,是把示波器的基础设置根据不同的测试场景存成不同的设置文件,需要时可以选择合适的场景设置导入进来这个设置…

CF207C3 Game with Two Trees

CF207C3 Game with Two Trees 妙到家的树上字符串问题。 约定树 \(1\):\(t_1\)。树 \(2\):\(t_2\)。\(S_{1/2}(i,l)\) 为树 \(1/2\) 上节点 \(i\) 沿父亲走经过 \(l\)​ 条边所构成的字符串。\(E_{1/2}(u,v)\) 为树 \(1/2\) 上,连接节点 \(u,v\)​ 的边的字符。\(fa_{1/2}u\…

Python环境变量设置与读取

★ 环境变量基本概念环境变量定义环境变量是操作系统中存储有关操作系统配置信息和应用程序运行环境的动态值的一种机制。环境变量的主要作用是为正在运行的进程提供配置信息,帮助程序找到所需的资源或者确定程序运行的方式。在操作系统中,每个进程都有自己的环境变量集合。这…

使用IDEA创建编写代码

使用IDEA创建编写代码 创建空项目文件夹选择Empty Project为工程文件夹命名选择文件夹创建路径点击Create创建Java工程模块 点击File->New->Module...选择Java,为工程文件命名,选择路径,点击Create。项目结构选择 点击File->Project Structure...SDK选择自己的JDK文…

SolidState 靶机 walkthrough

扫描 ┌──(root㉿kali)-[/home/kali] └─# nmap -T5 -A -v -p- 192.168.80.141 Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-24 03:50 EDT NSE: Loaded 155 scripts for scanning. NSE: Script Pre-scanning. Initiating NSE at 03:50 Completed NSE at 03:50, 0…

测试一下编辑器

这是个1级🚗标题🙃 这是内容 这是2级标题 这是内容 插入一个图片任意修改字体的颜色使得文章内容更加多彩神奇 插入一段代码 #include <iostream> using namespace std;int main() {cout << "Hello World!";return 0; }🛴