回溯题目:删除无效的括号
文章目录题目标题和出处难度题目描述要求示例数据范围解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析题目标题和出处标题删除无效的括号出处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/8/21 22:36:08 阅读更多 →
出版业薪酬难体现价值?北京华恒智信赋能能力定薪成功案例

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

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

2026/8/24 18:22:29 阅读更多 →
深入解析DM6441异构多核SoC:ARM与DSP协同设计与内存映射实战

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

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

2026/8/25 17:07:04 阅读更多 →

最新新闻

电池出口美国必看!UL/FCC/UN38.3三大认证缺一不可,避坑指南

电池出口美国必看!UL/FCC/UN38.3三大认证缺一不可,避坑指南

您是否正在为电池产品开拓广阔的美国市场,却被繁杂的认证标准弄得一头雾水?是否担心因不合规而导致货物被扣、巨额罚款甚至被电商平台下架? 美国市场对电池产品的准入要求极为严格,提前做好合规认证是您成功出口的唯一捷径。作为专…

2026/8/26 17:59:32 阅读更多 →
跨境卖家必看:婴儿学步车美国市场准入标准全解

跨境卖家必看:婴儿学步车美国市场准入标准全解

一、核心标准体系 美国对婴儿学步车建立了 "强制性联邦法规 自愿性行业标准"双轨并行 的监管体系: 关键点 :亚马逊美国站要求婴儿学步车必须同时满足 16 CFR 1216 和 CPSIA 要求,两者缺一不可。 二、16 CFR 1216 — 联邦强制安全标…

2026/8/26 17:59:32 阅读更多 →
小鸿AI全攻略:从开箱配网到打造专属语音智能体

小鸿AI全攻略:从开箱配网到打造专属语音智能体

基于 OpenHarmony 星闪 RISC-V 的全开源端侧 AI 硬件,从配网到拥有专属语音助手 引言:当硬件遇到AI 在接触小鸿AI之前,我对“端侧AI”的理解还停留在各种开发板的跑分和算力参数上。直到我亲手将这台基于OpenHarmony、采用RISC-V架构并支持…

2026/8/26 17:59:32 阅读更多 →
59. 【Java】Spring Boot 入门:第一个 Web 应用

59. 【Java】Spring Boot 入门:第一个 Web 应用

摘要: 本文是Spring Boot入门实战指南,从零开始手把手教你创建第一个Spring Boot应用。文章详细介绍了Spring Boot的核心概念、自动配置机制、起步依赖原理,并通过Hello World和用户管理API两个完整示例,展示如何快速构建RESTful …

2026/8/26 17:59:32 阅读更多 →
Bianfchheng (Jiiu ) 《边城(九)》全文汉语拼音字母标调实测案例

Bianfchheng (Jiiu ) 《边城(九)》全文汉语拼音字母标调实测案例

此文基于这项规则:汉语拼音字母标调规则 Bianfchheng (Jiiu ) Shenv Conwen Zuqfuc hhuija shh, dayuem yv jiangjnn pngchhang ch zaofann shhjje l, janpshang shoushang quansh dongxi. Yi shang xio shantou biann haan Cuicui, yao Cuicui la chuand gos xi…

2026/8/26 17:59:32 阅读更多 →
VS Code C/C++ 插件 cpptools 内存占用异常

VS Code C/C++ 插件 cpptools 内存占用异常

前期概要 使用VS code连接WSL经常性出现终端和IDE卡住无法使用,关闭VS后即正常。 根本原因 cpptools 吃内存 "全量符号索引常驻" "多文件夹多实例" "可能的宏/symlink 泄漏" "没用 compile_commands 限制范围" 内存…

2026/8/26 17:58:32 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →