【回溯-8】301.删除无效的括号
题目描述给你一个由若干括号和字母组成的字符串s删除最小数量的无效括号使得输入的字符串有效。返回所有可能的结果。答案可以按任意顺序返回。示例 1输入s ()())()输出[(())(),()()()]示例 2输入s (a)())()输出[(a())(),(a)()()]示例 3输入s )(输出[]解题思路方法一DFS 剪枝最优推荐思路第一步统计需要删除的左右括号数量用一次遍历模拟括号匹配遇到(时leftToRemove遇到)时如果leftToRemove 0则配对成功leftToRemove--否则这个)多余rightToRemove第二步DFS 尝试删除对每个括号字符有两种选择保留加入当前路径删除如果还有删除配额leftToRemove 0或rightToRemove 0则跳过关键剪枝当前路径中右括号数量不能超过左括号rightCount leftCount时剪枝剩余字符数不足以完成所需删除时剪枝相邻相同括号只删第一个避免重复解去重用HashSet存储结果代码实现class Solution { unordered_setstring result; int leftToRemove, rightToRemove; string s; public: vectorstring removeInvalidParentheses(string _s) { s _s; leftToRemove rightToRemove 0; // 第一步统计多余的左右括号数量 for (char c : s) { if (c () { leftToRemove; } else if (c )) { if (leftToRemove 0) { leftToRemove--; } else { rightToRemove; } } } dfs(0, , 0, 0); return vectorstring(result.begin(), result.end()); } void dfs(int index, string current, int leftCount, int rightCount) { // 剪枝右括号多于左括号无效 if (rightCount leftCount) return; if (index s.size()) { if (leftToRemove 0 rightToRemove 0) { result.insert(current); } return; } char c s[index]; if (c () { // 选择1保留 dfs(index 1, current c, leftCount 1, rightCount); // 选择2删除如果有配额 if (leftToRemove 0) { leftToRemove--; dfs(index 1, current, leftCount, rightCount); leftToRemove; } } else if (c )) { // 选择1保留 dfs(index 1, current c, leftCount, rightCount 1); // 选择2删除如果有配额 if (rightToRemove 0) { rightToRemove--; dfs(index 1, current, leftCount, rightCount); rightToRemove; } } else { // 字母直接保留 dfs(index 1, current c, leftCount, rightCount); } } };复杂度分析时间复杂度O(2^P × n)P 是括号总数≤20最坏情况遍历所有子集空间复杂度O(n)递归栈深度方法二BFS 逐层删除思路BFS 逐层删除一个括号直到找到有效的字符串。因为 BFS 按层遍历第一次找到的有效字符串就是删除数量最少的 。用queue存储当前层的所有字符串用visited集合去重处理完一层后如果找到了有效字符串只收集这一层的所有结果不再继续下一层代码实现class Solution { public: vectorstring removeInvalidParentheses(string s) { vectorstring result; unordered_setstring visited{s}; queuestring q{{s}}; bool found false; while (!q.empty()) { int size q.size(); for (int i 0; i size; i) { string cur q.front(); q.pop(); if (isValid(cur)) { result.push_back(cur); found true; } if (found) continue; // 已找到最短解不再扩展 for (int j 0; j cur.size(); j) { if (cur[j] ! ( cur[j] ! )) continue; string next cur.substr(0, j) cur.substr(j 1); if (visited.insert(next).second) { q.push(next); } } } if (found) break; } return result.empty() ? vectorstring{} : result; } bool isValid(const string s) { int count 0; for (char c : s) { if (c () count; else if (c )) { if (--count 0) return false; } } return count 0; } };复杂度分析时间复杂度O(n × 2^P)最坏情况枚举所有删除组合空间复杂度O(2^P × n)队列和 visited 集合存储大量字符串两种方法对比方法时间复杂度空间复杂度推荐度DFS 剪枝O(2^P × n)O(n)⭐⭐⭐⭐⭐BFS 逐层删除O(n × 2^P)O(2^P × n)⭐⭐⭐BFS 的问题空间占用大需要存储大量中间字符串 。DFS 通过统计删除数量直接剪枝空间效率更高。总结要点说明核心思想统计多余括号 → DFS 尝试删/留 → 剪枝去重关键剪枝rightCount leftCount时返回去重方式HashSet存储结果时间复杂度O(2^P × n)P ≤ 20

相关新闻

【回溯-6】79.单词搜索

【回溯-6】79.单词搜索

题目描述:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那…

2026/10/5 6:55:27 阅读更多 →
【回溯-7】494.目标和

【回溯-7】494.目标和

题目描述:给你一个非负整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 或 - ,然后串联起所有整数,可以构造一个 表达式 :例如,nums [2, 1] ,可以在 2 之前添加 ,在 1 之前添加…

2026/10/5 6:55:27 阅读更多 →
A股量化尾盘筛选对数据时效敏感:行情链路变慢时先排查哪里?

A股量化尾盘筛选对数据时效敏感:行情链路变慢时先排查哪里?

一句话结论:尾盘筛选“变慢”时,先判断数据是“旧了”还是“到得慢”,再按“请求次数 → 限流与重试 → 网络 → 本地计算 → 调度”的顺序逐段计时。多数情况下,瓶颈出在逐只请求、重试放大和本地处理上,而不在行情源…

2026/10/5 6:54:27 阅读更多 →

最新新闻

插件机制详解:IAR插件、加载失败排查与MusicFree配置

插件机制详解:IAR插件、加载失败排查与MusicFree配置

1. 插件机制到底在解决什么问题先说个真实体验。我这些年一直在折腾各类工具链,从嵌入式 IDE 到持续交付平台再到日常用的播放器,慢慢发现一个规律:凡是活得久、生态大的软件,几乎没有一个不是靠 plugins 撑起来的。编辑器要靠插件…

2026/10/5 8:04:58 阅读更多 →
FPGA高速接口调试必备:IBERT眼图测试原理与实战指南

FPGA高速接口调试必备:IBERT眼图测试原理与实战指南

1. IBERT眼图测试到底解决什么问题 先说结论:在FPGA高速串行接口调试里,IBERT(Integrated Bit Error Ratio Tester)眼图测试,是验证光纤接口信号质量最快、最省事的办法,没有之一。 很多工程师拿到一块带有…

2026/10/5 8:04:58 阅读更多 →
Xilinx IBERT光纤接口眼图测试实战:从搭建到链路排查

Xilinx IBERT光纤接口眼图测试实战:从搭建到链路排查

上个月调试一块自研的FPGA板卡,光口上电后业务一直跑不通,链路对端报了一堆CRC错误。排查了半天,最后是靠在Vivado里拉了一个IBERT核,对着SFP光模块做了一圈眼图扫描才定位到问题——居然是GTX参考时钟的走线串扰,眼图…

2026/10/5 8:04:58 阅读更多 →
SpringBoot+Vue宠物商城项目全解析:从架构到部署

SpringBoot+Vue宠物商城项目全解析:从架构到部署

先说一句大实话:SpringBoot Vue 这类商城项目,放到 GitHub 上一抓一大把,但绝大多数都是“能跑就行”的半成品——代码乱、没注释、表结构随意、前端页面粗制滥造。真正适合拿去当毕设、课设,或者静下心来学一遍的,反…

2026/10/5 8:04:58 阅读更多 →
SPI模式读写SD卡稳定性的关键:时序细节与状态机设计

SPI模式读写SD卡稳定性的关键:时序细节与状态机设计

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

2026/10/5 8:04:58 阅读更多 →
Tesseral地震正演建模实操:原理、案例与扩散模型应用

Tesseral地震正演建模实操:原理、案例与扩散模型应用

做地震勘探这行,手里总得有个趁手的正演工具。Tesseral是我接触过的多套正演软件里上手最快的一个,它最核心的价值就是解决一件很具体的事:把地下介质的速度、密度、构造形态做成一个可计算的地震模型,然后正演出一炮炮合成地震记…

2026/10/5 8:03:57 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

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

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

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

2026/10/5 0:00:23 阅读更多 →

周新闻

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/5 5:06:42 阅读更多 →
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/5 1:10:22 阅读更多 →
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/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/4 11:40:45 阅读更多 →
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/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练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/4 20:14:29 阅读更多 →