首页 > 其他分享 >递归+回溯解决有效括号问题

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

时间:2024-05-11 16:57:11浏览次数:19  
标签:语句 递归 第二个 ss 条件 括号 回溯 delete

题目描述:

数字 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

标签:语句,递归,第二个,ss,条件,括号,回溯,delete
From: https://www.cnblogs.com/Cailulian/p/18186783

相关文章

  • 使用js有效括号匹配封装函数
    点击查看代码functionisValidParentheses(str){//定义一个栈,用于存储待匹配的左括号letstack=[];//定义一个对象,用于快速判断括号是否成对constpairs={')':'(','}':'{',']':'['};//遍历输入字符串for(let......
  • hdu2024递归水题
    importjava.util.Scanner;publicclasshdu2044{publicstaticvoidmain(String[]args){//TODO自动生成的方法存根//坑点long[]aa=newlong[51];aa[1]=1;aa[2]=2;for(inti=3;i<aa.length;......
  • SQL脚本中存在很多括号,无法直观进行匹配。
    解决方案1:SSMS中找到前括号按下空格或tab,会自动匹配到对应的后括号,如下图。解决方案2:使用在线格式化工具进行格式化,该工具格式化功能更强大且会自动去除多余无意义的括号组。https://tool.oschina.net/codeformat/sql在线代码格式化(oschina.net) ......
  • .gitignore 全局忽略提交特定文件夹,不限路径递归忽略
    创建或修改全局.gitignore文件:在命令行中执行以下命令来创建或修改全局的.gitignore文件gitconfig--globalcore.excludesfile~/.gitignore_global如果文件已存在,则此命令会确保Git使用正确的文件。接下来,编辑这个文件(如果它不存在,这一步骤也会创建它):touch~/.gitig......
  • 基于改进MFCC特征和卷积递归神经网络的心音分类
    具体的软硬件实现点击http://mcu-ai.com/MCU-AI技术网页_MCU-AI人工智能心音分类在心血管疾病的早期发现中起着至关重要的作用,特别是对于小型初级卫生保健诊所。尽管近年来心音分类取得了很大进展,但其中大多数都是基于传统的分段特征和基于浅层结构的分类器。这些传统的声学表示......
  • php---递归获取最上级和所有子级
    在做PHP开发的过程中,经常会需要获取最上级或所有子级的应用场景:一、获取最顶级$list=[['id'=>1,'pid'=>0,'name'=>'张飞'],['id'=>2,'pid'=>1,'name'=>'张苞'],['id'=>3,......
  • [JS] idea中javascript显示无背景色,不能点击大括号收起代码
    idea idea安装组件File->Settings->pluginsmarketplace搜索安装javascriptandtypescript插件(如果marketplace搜素搜索不到,搜索下installed里是否已经安装过了;如果已经安装过了且勾选框是选中的,去勾选插件,保存。然后重新再勾选上,保存) 效果如下: ......
  • 假设每次截图有个命令 shotimg ,每次只能处理最大1w高 1w宽的图,现在有一张4w*4w的图需
    为了让这个函数更加灵活以支持任意大小的图片和不同的分割大小,我们可以将函数的参数稍作调整,使其接受目标分割尺寸(targetSize)作为参数,而不是硬编码为10000。同时,我们可以使用整数除法(//)来确保分割的尺寸是整数,并且使用模数运算符(%)来检查是否需要进行最后一次不完全的分割。以下是......
  • 如何用递归实现二叉搜索树的增删改查
    点击查看代码/**@Author:WangYiMing*@Date:2024-04-2323:37:21*@LastEditors:WangYiMing*@LastEditTime:2024-04-2618:22:35*/#include<stdio.h>#include<stdlib.h>///@brief二叉树基础结构typedefstructbinary_tree_node{intdata;stru......
  • 22. 括号生成-c++
    数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]classSolution{public:vector<string>generat......