news 2026/4/15 8:32:16

华为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/4/11 21:34:23

GLM-4.6V-Flash-WEB模型能否解析PDF中的图文混合内容?

GLM-4.6V-Flash-WEB模型能否解析PDF中的图文混合内容&#xff1f; 在企业文档自动化、智能客服和数字办公日益普及的今天&#xff0c;一个现实而棘手的问题摆在开发者面前&#xff1a;如何让AI真正“读懂”一份包含文字、表格、图表甚至手写批注的PDF文件&#xff1f;传统的OCR…

作者头像 李华
网站建设 2026/4/14 20:07:19

Selenium自动化测试的显示等待

在进行UI自动化测试的时候&#xff0c;我们为了保持用例的稳定性&#xff0c;往往要设置显示等待&#xff0c;显示等待就是说明确的要等到某个元素的出现或者元素的某些条件出现&#xff0c;比如可点击、可见等条件&#xff0c;如果在规定的时间之内都没有找到&#xff0c;那么…

作者头像 李华
网站建设 2026/4/8 8:32:37

提升多模态AI项目效率:GLM-4.6V-Flash-WEB快速上手经验分享

提升多模态AI项目效率&#xff1a;GLM-4.6V-Flash-WEB快速上手经验分享 在如今这个图像信息爆炸的时代&#xff0c;用户不再满足于“你看到什么”&#xff0c;而是希望系统能回答“这意味着什么”。从电商平台的自动图文审核&#xff0c;到教育App里的习题解析助手&#xff0c;…

作者头像 李华
网站建设 2026/4/13 5:56:41

GLM-4.6V-Flash-WEB模型实战:图文理解与图像问答的低延迟解决方案

GLM-4.6V-Flash-WEB模型实战&#xff1a;图文理解与图像问答的低延迟解决方案 在电商客服自动识别商品截图、教育平台解析学生上传的习题图片、或是内容审核系统判断违规视觉信息的场景中&#xff0c;一个共同的挑战浮出水面&#xff1a;如何让AI既“看得懂”图像细节&#xff…

作者头像 李华
网站建设 2026/4/12 16:12:58

GLM-4.6V-Flash-WEB模型在内容安全审核中的实际应用效果

GLM-4.6V-Flash-WEB模型在内容安全审核中的实际应用效果 如今&#xff0c;一条带图的社交媒体动态可能藏着比文字更深的“雷”——一张看似普通的健身照配上一句“加微信看私密视频”&#xff0c;就能绕过大多数基于关键词或图像分类的传统审核系统。这种图文协同违规的现象&am…

作者头像 李华