当前位置: 首页 > news >正文

华为OD面试手撕真题 - 移除无效括号

题目描述

给你一个由'('')'和小写字母组成的字符串s

你需要从字符串中删除最少数目的'('或者')'(可以删除任意位置的括号),使得剩下的「括号字符串」有效。

请返回任意一个合法字符串。

有效「括号字符串」应当符合以下任意一条要求:

  • 空字符串或只包含小写字母的字符串
  • 可以被写作ABA连接B)的字符串,其中AB都是有效「括号字符串」
  • 可以被写作(A)的字符串,其中A是一个有效的「括号字符串」

示例1

输入:s = "lee(t(c)o)de)" 输出:"lee(t(c)o)de" 解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。

示例2

输入:s = "a)b(c)d" 输出:"ab(c)d"

示例3

输入:s = "))((" 输出:"" 解释:空字符串也是有效的

提示

  • 1 <= s.length <= 105
  • s[i]可能是'('')'或英文小写字母

题解

力扣原题链接

这道题已经多次反馈考过,并且栈还是比较高频的题目,建议一定要掌握。

思路:栈模拟

  1. 保证结果中的括号全部有效的要求就是保证所有右括号都有对应的左括号对应(左括号数量 = 右括号数量),并且在字符串任意前缀,右括号不能多余左括号数量
  2. 基于1的直接使用栈进行模拟,定义leftCount = 0记录前缀中已经包含的左括号数量,循环遍历输入字符串吧先保证在字符串任意前缀,右括号不能多余左括号数量,具体逻辑,对于字符c
    • 属于小写字母,直接压入栈。
    • 属于(,直接压入栈,并更新leftCount += 1
    • 属于),此时需要判断左侧是有未匹配括号,如果leftCount ==0,直接跳过不压入栈。否则将当前压入栈,并更新leftCount -=1
  3. 根据2的逻辑处理之后,可以保证在字符串任意前缀,右括号不能多余左括号数量,但并不能保证栈中左括号 = 右括号数量,此时左括号数量可能多余右括号数量,多个个数就是leftCount, 至于移除多个数量只需要弹栈的过程中,如果c == '(' 并且 leftCount >0,直接丢弃并更新leftCount -= 1就行。最后得到的字符串就是结果。
  4. 上面算法逻辑的实现复杂度为O(n)

c++

class Solution { public: string minRemoveToMakeValid(string str) { // 栈模拟 stack<char> s; int n = str.size(); // 前面剩余未匹配左括号的数量 int leftCount = 0; for (int i = 0; i < n; i++) { char c = str[i]; if (c == '(') { leftCount++; s.push(c); } else if (c == ')') { // 前面未匹配左括号数量 <= 0, 当前右括号不合法 if (leftCount <= 0) { continue; } // 匹配一个左 leftCount--; s.push(c); } else { s.push(c); } } string res = ""; // 收尾操作,主要是移除未匹配的左括号 while (!s.empty()) { char c = s.top(); s.pop(); // 非法的左括号,移除 if (c == '(' && leftCount > 0) { leftCount--; continue; } res.push_back(c); } // 反向 reverse(res.begin(), res.end()); return res; ; } };

JAVA

import java.util.*; class Solution { public String minRemoveToMakeValid(String str) { // 栈模拟 Deque<Character> stack = new ArrayDeque<>(); int n = str.length(); // 前面剩余未匹配左括号的数量 int leftCount = 0; for (int i = 0; i < n; i++) { char c = str.charAt(i); if (c == '(') { leftCount++; stack.push(c); } else if (c == ')') { // 前面未匹配左括号数量 <= 0,当前右括号不合法 if (leftCount <= 0) { continue; } // 匹配一个左括号 leftCount--; stack.push(c); } else { stack.push(c); } } StringBuilder res = new StringBuilder(); // 收尾操作,主要是移除未匹配的左括号 while (!stack.isEmpty()) { char c = stack.pop(); // 非法的左括号,移除 if (c == '(' && leftCount > 0) { leftCount--; continue; } res.append(c); } // 反向 return res.reverse().toString(); } }

Python

classSolution:defminRemoveToMakeValid(self,s:str)->str:# 栈模拟stack=[]# 前面剩余未匹配左括号的数量leftCount=0forcins:ifc=='(':leftCount+=1stack.append(c)elifc==')':# 前面未匹配左括号数量 <= 0,当前右括号不合法ifleftCount<=0:continue# 匹配一个左括号leftCount-=1stack.append(c)else:stack.append(c)res=[]# 收尾操作,主要是移除未匹配的左括号whilestack:c=stack.pop()# 非法的左括号,移除ifc=='('andleftCount>0:leftCount-=1continueres.append(c)# 反向return''.join(reversed(res))

JavaScript

/** * @param {string} s * @return {string} */varminRemoveToMakeValid=function(s){// 栈模拟conststack=[];// 前面剩余未匹配左括号的数量letleftCount=0;for(constcofs){if(c==='('){leftCount++;stack.push(c);}elseif(c===')'){// 前面未匹配左括号数量 <= 0,当前右括号不合法if(leftCount<=0){continue;}// 匹配一个左括号leftCount--;stack.push(c);}else{stack.push(c);}}constres=[];// 收尾操作,主要是移除未匹配的左括号while(stack.length>0){constc=stack.pop();// 非法的左括号,移除if(c==='('&&leftCount>0){leftCount--;continue;}res.push(c);}// 反向returnres.reverse().join('');};

Go

funcminRemoveToMakeValid(sstring)string{// 栈模拟stack:=make([]rune,0)// 前面剩余未匹配左括号的数量leftCount:=0for_,c:=ranges{ifc=='('{leftCount++stack=append(stack,c)}elseifc==')'{// 前面未匹配左括号数量 <= 0,当前右括号不合法ifleftCount<=0{continue}// 匹配一个左括号leftCount--stack=append(stack,c)}else{stack=append(stack,c)}}res:=make([]rune,0)// 收尾操作,主要是移除未匹配的左括号forlen(stack)>0{c:=stack[len(stack)-1]stack=stack[:len(stack)-1]// 非法的左括号,移除ifc=='('&&leftCount>0{leftCount--continue}res=append(res,c)}// 反向fori,j:=0,len(res)-1;i<j;i,j=i+1,j-1{res[i],res[j]=res[j],res[i]}returnstring(res)}
http://www.jsqmd.com/news/200556/

相关文章:

  • GLM-4.6V-Flash-WEB模型能否理解双关语图像表达?
  • 从Java全栈开发到实战:一次真实的面试对话
  • GLM-4.6V-Flash-WEB模型能否解析PDF中的图文混合内容?
  • 交互型机器人深度解析与行业设备分类综述 - 智造出海
  • GLM-4.6V-Flash-WEB模型能否识别古建筑结构特征?
  • 对比主流视觉大模型:GLM-4.6V-Flash-WEB为何更适合Web服务?
  • 如何在CentOS 7.9 上部署并优化高性能 Redis 集群,支持跨数据中心的低延迟访问?
  • 警惕!还在用传统统计模型?随机森林 + 不确定性量化,轻松拿捏环境类核心期刊
  • GLM-4.6V-Flash-WEB模型适配移动端App的技术路径
  • Playwright处理iframe和Shadow DOM的实战技巧
  • 【收藏必看】2024-2025年Multi-Agent全面爆发:6大主流框架深度解析,AI开发深水区避坑指南
  • 如何在Web端高效运行GLM-4.6V-Flash-WEB多模态模型?完整教程分享
  • 根据上一个测试用例的执行结果决定某一夹具的使用情况
  • 【珍藏干货】LangGraph年度学习总结:三大维度+三层架构,构建完整AI Agent知识体系
  • 关注地下水与地表水安全:农业 N/P 面源污染迁移机制、模拟方法与减排实践,从剖面淋失到区域负荷:农业面源污染评估的 N/P 迁移模拟进阶路径
  • 竞赛毕业设计定制作品---【芳心科技】F. 基于单片机摩托车发动机温度控制系统设计
  • 46、线程邮箱系统(C语言+多线程通信)
  • 如何在 Ubuntu 22.04 服务器上通过 Ansible 自动化管理 Docker 容器,简化部署与更新流程?
  • 提升多模态AI项目效率:GLM-4.6V-Flash-WEB快速上手经验分享
  • 通过ADB调试远程服务器上的GLM-4.6V-Flash-WEB实例
  • 结合JavaScript前端实现GLM-4.6V-Flash-WEB图像识别结果可视化
  • GLM-4.6V-Flash-WEB模型支持WebSocket实时交互吗?
  • 【必收藏】从Manus被收购看AI Agent架构:6大核心模块Python代码全实现(附完整代码)
  • GLM-4.6V-Flash-WEB模型实战:图文理解与图像问答的低延迟解决方案
  • 竞赛毕业设计定制作品---【芳心科技】F. 基于单片机的泡茶机
  • GLM-4.6V-Flash-WEB模型是否支持增量学习或微调?
  • 让小模型逆袭!RouteRAG端到端强化学习实现文本/图谱智能检索,收藏必学!
  • wangEditor pdf导入识别图表和文本高亮
  • 城市热岛效应研究:GLM-4.6V-Flash-WEB分析红外遥感数据
  • 存储型跨站脚本攻击剖析:HTML上下文(无编码防护)