回溯题目:删除无效的括号
文章目录题目标题和出处难度题目描述要求示例数据范围解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析题目标题和出处标题删除无效的括号出处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/7/22 15:46:46阅读更多 →
GEO优化如何匹配用户意图?广拓时代拆解关键词布局

GEO优化如何匹配用户意图?广拓时代拆解关键词布局

AI搜索改变了关键词的价值。过去关键词像入口,用户搜到页面后自己判断;现在关键词更像线索,AI会沿着线索理解内容、筛选信源、组织答案。 所以,企业做GEO优化时,不能只问“我要布局哪些词”,还要问“这些词…

2026/7/22 15:44:45阅读更多 →
GEO优化不是堆词,广拓时代解析AI推荐的语义路径

GEO优化不是堆词,广拓时代解析AI推荐的语义路径

很多企业以为GEO优化就是把“AI搜索”“GEO优化”“品牌推荐”这些词多写几遍。其实,在AI大模型的理解逻辑里,词出现多少次并不是核心,词和问题、场景、证据之间有没有关系,才更关键。 AI不只是匹配关键词,它会判断内容…

2026/7/22 15:44:45阅读更多 →
TI VPDMA中断配置实战:从寄存器解析到系统级调试

TI VPDMA中断配置实战:从寄存器解析到系统级调试

1. 项目概述 在嵌入式视频处理系统的开发中,尤其是面对德州仪器(TI)这类高性能SoC时,中断管理往往是决定系统稳定性和实时性的关键。很多工程师拿到芯片手册,看到动辄几十页的寄存器描述,尤其是像VPDMA&…

2026/7/22 16:38:54阅读更多 →
桌面图标隐藏工具!录屏怕桌面太乱?隐藏S+!

桌面图标隐藏工具!录屏怕桌面太乱?隐藏S+!

前言 常年录教程、直播、线上会议的朋友一定深有体会,满屏文件、快捷方式全暴露,隐私文件一览无余。录出来的视频里,桌面图标乱七八糟。要是手动把图标藏起来,录完还得再费劲挪回原位。 今天分享两款“桌面图标一键隐藏工具”&a…

2026/7/22 16:38:54阅读更多 →
AI副业如何从0到月入5万?揭秘头部玩家正在用的3个公域流量裂变公式

AI副业如何从0到月入5万?揭秘头部玩家正在用的3个公域流量裂变公式

更多请点击: https://kaifayun.com 第一章:AI副业如何从0到月入5万?揭秘头部玩家正在用的3个公域流量裂变公式 在抖音、小红书、B站等公域平台,头部AI副业玩家已不再依赖“单点内容曝光”,而是通过可复制、可度量、可…

2026/7/22 16:38:54阅读更多 →
速度与精度的结合:Faster R-CNN模型的性能剖析

速度与精度的结合:Faster R-CNN模型的性能剖析

目标检测作为计算机视觉领域的核心问题之一,其重要性随着深度学习技术的发展而日益凸显。本文深入探讨了基于深度学习的Faster R-CNN模型,这是一种革命性的目标检测框架,它通过引入区域提议网络(Region Proposal Network, RPN&…

2026/7/22 16:38:54阅读更多 →
深入解析IOMM特殊复用:ADC触发、ePWM同步与安全机制实战

深入解析IOMM特殊复用:ADC触发、ePWM同步与安全机制实战

1. 项目概述与IOMM核心价值在嵌入式系统,尤其是汽车电子和工业控制这类对实时性、可靠性和资源利用率要求极高的领域,微控制器(MCU)的引脚资源往往非常紧张。一颗MCU需要驱动电机、采样传感器、处理通信、管理故障保护&#xff0c…

2026/7/22 16:38:54阅读更多 →
TI VPDMA中断寄存器深度解析与嵌入式视频处理驱动实战

TI VPDMA中断寄存器深度解析与嵌入式视频处理驱动实战

1. 项目概述与中断机制在视频处理中的核心地位在嵌入式视频处理系统的开发中,尤其是面对德州仪器(TI)这类高性能多媒体SoC时,中断管理往往是决定系统实时性、稳定性和效率的“命门”。我处理过不少基于达芬奇(DaVinci&…

2026/7/22 16:36:54阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →