news 2026/4/7 14:16:09

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为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)}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 14:24:10

GLM-4.6V-Flash-WEB模型中的跨模态推理机制详解

GLM-4.6V-Flash-WEB模型中的跨模态推理机制详解 在当前AI技术向“看得懂、问得清、答得准”演进的过程中&#xff0c;一个核心挑战逐渐浮现&#xff1a;如何让机器不仅识别图像内容&#xff0c;还能像人一样结合上下文进行理解与推断&#xff1f;传统图文系统往往依赖OCR、目标…

作者头像 李华
网站建设 2026/4/4 0:22:50

测试 LazyLLM 的工程化落地能力:从开发者体验与生产环境需求

引言&#xff1a;LazyLLM 的概述 在人工智能应用开发领域&#xff0c;构建高效的多Agent系统已成为开发者关注的焦点。LazyLLM&#xff0c;由商汤科技&#xff08;SenseTime&#xff09;旗下的LazyAGI团队开发&#xff0c;是一个一站式开发工具包&#xff0c;旨在简化AI应用的…

作者头像 李华
网站建设 2026/3/16 3:54:23

开源多模态模型新选择:GLM-4.6V-Flash-WEB全面支持图文混合输入

开源多模态模型新选择&#xff1a;GLM-4.6V-Flash-WEB全面支持图文混合输入 在智能应用日益依赖“看懂世界”的今天&#xff0c;单纯的文本理解已经无法满足真实场景的需求。用户上传一张产品图问“这个能用在户外吗&#xff1f;”&#xff0c;客服系统如果只能读文字而看不懂图…

作者头像 李华
网站建设 2026/3/19 2:06:56

救命神器8个AI论文软件,研究生搞定毕业论文不求人!

救命神器8个AI论文软件&#xff0c;研究生搞定毕业论文不求人&#xff01; 论文写作的救星&#xff0c;AI 工具如何改变你的研究生活 在研究生阶段&#xff0c;论文写作不仅是学术能力的体现&#xff0c;更是时间与精力的双重考验。随着人工智能技术的不断进步&#xff0c;越来…

作者头像 李华
网站建设 2026/4/3 18:37:44

根据上一个测试用例的执行结果决定某一夹具的使用情况

根据上一个测试用例的执行结果决定某一夹具的使用情况 根据测试用例执行情况&#xff0c;决定测试结束要不要将环境下电&#xff0c;pytest的夹具实现和python的条件控制好像区别不大的样子 目标效果 目前我是写了一个电源控制的夹具&#xff0c;原本的设计思路&#xff1a;…

作者头像 李华
网站建设 2026/4/7 7:44:36

收藏!2025智能体元年:企业级AI平台构建12大核心经验全攻略

2025年被视为"智能体元年"&#xff0c;AI正从"聊天助手"进化为"主动干活的数字员工"。文章详细介绍了AI从1.0到3.0的演进&#xff0c;阐述了智能体的三大核心能力&#xff08;自主规划、工具调用和多智能体协同&#xff09;&#xff0c;分享了企…

作者头像 李华