回溯题目:删除无效的括号
文章目录题目标题和出处难度题目描述要求示例数据范围解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析题目标题和出处标题删除无效的括号出处301. 删除无效的括号难度8 级题目描述要求给定一个由括号和字母组成的字符串s \texttt{s}s删除最小数量的无效括号使得输入的字符串有效。返回所有可能的结果。可以按任意顺序返回答案。示例示例 1输入s ()())() \texttt{s ()())()}s ()())()输出[(())(),()()()] \texttt{[(())(),()()()]}[(())(),()()()]示例 2输入s (a)())() \texttt{s (a)())()}s (a)())()输出[(a())(),(a)()()] \texttt{[(a())(),(a)()()]}[(a())(),(a)()()]示例 3输入s )( \texttt{s )(}s )(输出[] \texttt{[]}[]数据范围1 ≤ s.length ≤ 25 \texttt{1} \le \texttt{s.length} \le \texttt{25}1≤s.length≤25s \texttt{s}s由小写英语字母以及括号‘(’ \texttt{(}‘(’和‘)’ \texttt{)}‘)’组成s \texttt{s}s中至多含20 \texttt{20}20个括号解法一思路和算法这道题要求从字符串s ss中删除最少数量的无效括号使得字符串中剩余的字符有效。最少操作符合广度优先搜索的应用场景因此可以使用广度优先搜索得到删除次数最少的情况下的全部有效字符串。广度优先搜索的做法是对于字符串中的每个括号将其删除之后得到一个新的字符串将新的字符串在下一轮搜索。第0 00轮遍历初始字符串s ss第i ii轮遍历所有删除i ii个括号之后的字符串即每一轮遍历的字符串的长度依次递减。对于当前轮的全部字符串判断每个字符串是否有效如果有效则将其添加到答案中。如果一轮结束之后答案不为空则找到删除次数最少的情况下的全部有效字符串此时结束搜索返回答案。实现方面有以下两点说明。如果当前字符串中有两个相邻的相同括号字符则删除其中任意一个括号字符得到的新字符串是相同的因此只需要考虑删除其中一个括号字符得到的新字符串跳过相邻的其余相同括号字符。使用哈希集合存储每一轮遍历的字符串可以确保同一个字符串只访问一次。代码classSolution{publicListStringremoveInvalidParentheses(Strings){ListStringvalidnewArrayListString();SetStringsetnewHashSetString();set.add(s);while(!set.isEmpty()){for(Stringstr:set){if(isValid(str)){valid.add(str);}}if(!valid.isEmpty()){break;}SetStringnextSetnewHashSetString();for(Stringstr:set){intlengthstr.length();for(inti0;ilength;i){charcstr.charAt(i);if((i0cstr.charAt(i-1))||(c!(c!))){continue;}StringnextStrstr.substring(0,i)str.substring(i1);nextSet.add(nextStr);}}setnextSet;}returnvalid;}publicbooleanisValid(Stringstr){intcount0;intlengthstr.length();for(inti0;ilength;i){charcstr.charAt(i);if(c(){count;}elseif(c)){count--;}if(count0){returnfalse;}}returncount0;}}复杂度分析时间复杂度O ( n 2 × 2 n ) O(n^2 \times 2^n)O(n2×2n)其中n nn是字符串s ss的长度。字符串s ss最多有2 n 2^n2n个子序列因此广度优先搜索的过程中最多遍历2 n 2^n2n个不同的字符串对于每个字符串的操作时间是O ( n 2 ) O(n^2)O(n2)的时间将每个有效字符串添加到答案需要O ( n ) O(n)O(n)的时间因此时间复杂度是O ( n 2 × 2 n ) O(n^2 \times 2^n)O(n2×2n)。空间复杂度O ( n × 2 n ) O(n \times 2^n)O(n×2n)其中n nn是字符串s ss的长度。字符串s ss最多有2 n 2^n2n个子序列因此广度优先搜索的过程中最多遍历2 n 2^n2n个不同的字符串每个字符串的长度不超过n nn因此空间复杂度是O ( n × 2 n ) O(n \times 2^n)O(n×2n)。解法二思路和算法也可以使用回溯的做法得到删除次数最少的情况下的全部有效字符串。由于回溯本身不保证得到最少操作的答案因此需要首先遍历字符串得到左括号和右括号的最少删除次数。计算左括号和右括号的最少删除次数时需要考虑剩余的左括号和右括号的个数相等且任意前缀中的左括号个数大于等于右括号个数。具体做法是使用leftRemove \textit{leftRemove}leftRemove和rightRemove \textit{rightRemove}rightRemove分别表示左括号和右括号的最少删除次数从左到右遍历字符串s ss执行如下操作。如果遇到左括号则将leftRemove \textit{leftRemove}leftRemove加1 11。如果遇到右括号则当leftRemove 0 \textit{leftRemove} 0leftRemove0时将rightRemove \textit{rightRemove}rightRemove加1 11当leftRemove 0 \textit{leftRemove} 0leftRemove0时将leftRemove \textit{leftRemove}leftRemove减1 11。根据有效括号的定义一定可以从s ss中删除leftRemove \textit{leftRemove}leftRemove个左括号和rightRemove \textit{rightRemove}rightRemove个右括号得到有效的字符串。得到左括号和右括号的最少删除次数之后执行回溯回溯过程中需要维护当前字符串str \textit{str}str、开始下标index \textit{index}index、左括号的剩余删除次数leftRemove \textit{leftRemove}leftRemove和右括号的剩余删除次数rightRemove \textit{rightRemove}rightRemove回溯的做法如下。如果leftRemove rightRemove 0 \textit{leftRemove} \textit{rightRemove} 0leftRemoverightRemove0则所有的删除次数都用完当str \textit{str}str有效时将str \textit{str}str添加到答案中。如果leftRemove \textit{leftRemove}leftRemove和rightRemove \textit{rightRemove}rightRemove中至少有一个大于0 00则需要继续删除括号。对于从index \textit{index}index开始的每个下标i ii如果str [ i ] \textit{str}[i]str[i]是括号且对应的剩余删除次数大于0 00则得到将str [ i ] \textit{str}[i]str[i]删除后的新字符串将对应的剩余删除次数减1 11从开始下标i ii继续回溯。回溯过程中有以下两处可以剪枝。如果当前字符串的剩余字符个数少于leftRemove rightRemove \textit{leftRemove} \textit{rightRemove}leftRemoverightRemove则即使将剩余字符全部删除也不可能得到有效字符串因此停止当前回溯。如果当前字符串中有两个相邻的相同括号字符则删除其中任意一个括号字符得到的新字符串是相同的因此只需要考虑删除其中一个括号字符得到的新字符串跳过相邻的其余相同括号字符。代码classSolution{ListStringvalidnewArrayListString();publicListStringremoveInvalidParentheses(Strings){intleftRemove0,rightRemove0;intlengths.length();for(inti0;ilength;i){charcs.charAt(i);if(c(){leftRemove;}elseif(c)){if(leftRemove0){rightRemove;}else{leftRemove--;}}}backtrack(s,0,leftRemove,rightRemove);returnvalid;}publicvoidbacktrack(Stringstr,intindex,intleftRemove,intrightRemove){if(leftRemove0rightRemove0){if(isValid(str)){valid.add(str);}}else{intlengthstr.length();for(intiindex;ilength;i){if(length-ileftRemoverightRemove){break;}charcstr.charAt(i);if(iindexcstr.charAt(i-1)){continue;}StringnextStrstr.substring(0,i)str.substring(i1);if(c(leftRemove0){backtrack(nextStr,i,leftRemove-1,rightRemove);}elseif(c)rightRemove0){backtrack(nextStr,i,leftRemove,rightRemove-1);}}}}publicbooleanisValid(Stringstr){intcount0;intlengthstr.length();for(inti0;ilength;i){charcstr.charAt(i);if(c(){count;}elseif(c)){count--;}if(count0){returnfalse;}}returncount0;}}复杂度分析时间复杂度O ( n 2 × 2 n ) O(n^2 \times 2^n)O(n2×2n)其中n nn是字符串s ss的长度。字符串s ss最多有2 n 2^n2n个子序列因此回溯的过程中最多遍历2 n 2^n2n个不同的字符串对于每个字符串的操作时间是O ( n 2 ) O(n^2)O(n2)的时间将每个有效字符串添加到答案需要O ( n ) O(n)O(n)的时间因此时间复杂度是O ( n 2 × 2 n ) O(n^2 \times 2^n)O(n2×2n)。空间复杂度O ( n × 2 n ) O(n \times 2^n)O(n×2n)其中n nn是字符串s ss的长度。字符串s ss最多有2 n 2^n2n个子序列因此回溯的过程中最多遍历2 n 2^n2n个不同的字符串每个字符串的长度不超过n nn因此空间复杂度是O ( n × 2 n ) O(n \times 2^n)O(n×2n)。

相关新闻

别再只看参数量了!真正决定AI输出质量的3个隐藏变量(含可复现的量化评估Python脚本)

别再只看参数量了!真正决定AI输出质量的3个隐藏变量(含可复现的量化评估Python脚本)

更多请点击: https://kaifayun.com 第一章:别再只看参数量了!真正决定AI输出质量的3个隐藏变量(含可复现的量化评估Python脚本) 大模型参数量常被当作性能标尺,但实测表明:相同参数规模的模型在…

2026/10/4 7:09:53 阅读更多 →
出版业薪酬难体现价值?北京华恒智信赋能能力定薪成功案例

出版业薪酬难体现价值?北京华恒智信赋能能力定薪成功案例

【导读】薪酬管理是企业进行人力资源开发与管理的核心环节。薪酬管理体系的一些漏洞也往往会导致很多问题,诸如,优秀人才不断流失、员工工作积极性及持久性差等,面对这一系列问题,人力资源专家——华恒智信提出引入能力等级工资制…

2026/10/3 4:54:15 阅读更多 →
深入解析DM6441异构多核SoC:ARM与DSP协同设计与内存映射实战

深入解析DM6441异构多核SoC:ARM与DSP协同设计与内存映射实战

1. 项目概述:深入DM6441的异构世界如果你正在设计一个需要同时处理复杂控制逻辑和高强度数字信号处理(比如视频编解码或实时图像分析)的嵌入式系统,那么像德州仪器(TI)的TMS320DM6441这类异构多核SoC&#…

2026/10/4 1:30:11 阅读更多 →

最新新闻

xv6实验入门:从环境搭建到sleep命令全链路解析

xv6实验入门:从环境搭建到sleep命令全链路解析

1. 这不是“操作系统课作业”,而是一次亲手触摸Unix灵魂的实操入口如果你在搜索引擎里敲下“xv6怎么安装”“qemu windows 11 下”“如何执行 unix make”,说明你已经站在了MIT 6.S081实验的第一道门槛前——不是被PPT和概念包围,而是手握终端…

2026/10/4 7:09:47 阅读更多 →
26年给8款论文查重降重打了次分:结果有点意外

26年给8款论文查重降重打了次分:结果有点意外

毕业季的深夜,宿舍楼里亮着的屏幕大半都在跟论文较劲。查重报告上标红的段落、导师消息里那句"重复率再压一压",逼着人把希望寄托在各种降重工具上。可市面上的产品宣传一个比一个响亮,实际效果却要打了分才知道。这次花了两周时间…

2026/10/4 7:09:47 阅读更多 →
国内大学生论文季必用的AI论文网站有哪些?

国内大学生论文季必用的AI论文网站有哪些?

国内高校学生在论文写作过程中,越来越依赖AI论文工具提升效率,目前主流工具以本土化全流程服务为主,结合通用大模型与专业辅助功能,覆盖选题构思、框架搭建、初稿撰写、内容降重、查重检测及格式排版等关键环节,以下将…

2026/10/4 7:09:47 阅读更多 →
Carsim 找不到 MATLAB?从版本兼容到路径配置的完整排查指南

Carsim 找不到 MATLAB?从版本兼容到路径配置的完整排查指南

Carsim 和 Matlab/Simulink 联合仿真时报"Cannot find MATLAB",Carsim 界面里怎么选都匹配不上 MATLAB 安装目录——这个问题我前后排查了两天,期间走过不少弯路,甚至一度怀疑是安装包的问题,最后发现其实是 Carsim 定位…

2026/10/4 7:09:47 阅读更多 →
2026-09-30 GitHub Trending 速报:高效刷榜与项目评估指南

2026-09-30 GitHub Trending 速报:高效刷榜与项目评估指南

早上打开 GitHub Trending 已经成了我的固定动作,像有些人每天刷新闻一样,我看的是开源世界每天冒出来的新东西。2026-09-30 这天的榜单纯粹是“信息量很大”的那种,AI 工具、机器人项目、个人知识库、还有几个怎么看都不像正经项目的仓库&am…

2026/10/4 7:09:47 阅读更多 →
JavaWeb小型音乐网站完整案例:从数据库设计到部署排错全解析

JavaWeb小型音乐网站完整案例:从数据库设计到部署排错全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 7:08:47 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →