news 2026/4/25 20:08:52

算法---LeetCode 678. 有效的括号字符串

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法---LeetCode 678. 有效的括号字符串

1. 题目

原题链接

给你一个只包含三种字符的字符串,支持的字符类型分别是 ‘(’、‘)’ 和 ‘*’。请你检验这个字符串是否为有效字符串,如果是 有效 字符串返回 true 。

有效 字符串符合如下规则:

任何左括号 ‘(’ 必须有相应的右括号 ‘)’。
任何右括号 ‘)’ 必须有相应的左括号 ‘(’ 。
左括号 ‘(’ 必须在对应的右括号之前 ‘)’。
‘*’ 可以被视为单个右括号 ‘)’ ,或单个左括号 ‘(’ ,或一个空字符串 “”。

示例 1:

输入:s = “()”
输出:true
示例 2:

输入:s = “(*)”
输出:true
示例 3:

输入:s = “(*))”
输出:true

提示:

1 <= s.length <= 100
s[i] 为 ‘(’、‘)’ 或 ‘*’

2. 题解

2.1 解法1: 两个栈

两个栈记录目前为止不能匹配的字符,也就是*和(,每次出现右括号我们就应该去两个栈匹配可以匹配的左括号。

而*可以作为任何括号,也可以作为空字符串,所以我们应该优先用左括号匹配,所以我们出栈的策略如下:

  1. 遇到左括号,直接进栈,记录括号的位置。
  2. 遇到星号,直接进栈,记录星号的位置。
  3. 遇到右括号:
    a: 左括号栈里有元素,直接出栈。
    b: 左括号栈里无元素,*栈里有元素,直接出栈。无元素的话就已经匹配失败了。

如果遍历完数组的话,我们可能会发现左括号栈里还有结余元素。如果是20题的情况,已经失败了。但现在我们可能还有一些星号可以作为右括号用,所以我们进行下面的匹配操作:

对左括号栈逐一出栈,然后去看此时星号栈的栈顶,如果栈顶元素的位置大于左括号栈顶元素的位置,说明星号在括号的右侧,可以匹配。否则不可。

classSolution{publicbooleancheckValidString(Strings){Deque<Integer>star=newLinkedList<>();Deque<Integer>left=newLinkedList<>();for(inti=0;i<s.length();i++){charc=s.charAt(i);if(c=='('){left.offerLast(i);}elseif(c=='*'){star.offerLast(i);}elseif(!left.isEmpty()){left.pollLast();}elseif(!star.isEmpty()){star.pollLast();}else{returnfalse;}}while(!left.isEmpty()&&!star.isEmpty()){if(left.pollLast()>star.pollLast()){returnfalse;}}returnleft.isEmpty();}}

参考:
【微扰理论】肯定是栈呀)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 22:33:15

虚拟机上由于网络问题无法正常git clone

命令&#xff1a; git clone https://github.com/IFL-CAMP/easy_handeye.git #​&#xff08;https://github.com/IFL-CAMP/easy_handeye.git 是官方的easy_handeye&#xff0c;手眼标定包&#xff0c;支持ROS Melodic&#xff09;。​ 报错“gnutls_handshake() failed: Err…

作者头像 李华
网站建设 2026/4/23 19:13:47

2026高职商务数据分析师必考证书指南

商务数据分析师是当前热门职业之一&#xff0c;随着数据驱动决策的需求增长&#xff0c;相关证书的含金量也在不断提升。以下是2026年高职商务数据分析师必考证书的详细分析&#xff0c;涵盖证书类型、考试内容、适用人群及推荐理由。CDA数据分析师认证CDA&#xff08;Certifie…

作者头像 李华
网站建设 2026/4/21 16:03:57

对象是啥,类的构造器,this及他们的使用场景

对象到底是啥ps:对象就是一种特殊的数据结构&#xff0c;类是一个模板&#xff0c;对象是用类new出来的&#xff0c;有了类就可以创建出对象。构造器的使用是为了方便给对象属性赋值ps:变量存在栈里&#xff0c;变量指向对象&#xff0c;对象存在堆里&#xff0c;对象指向类&am…

作者头像 李华
网站建设 2026/4/24 15:25:12

30、脚本杂谈:transpose、m1 宏处理器与 sed 快速参考

脚本杂谈:transpose、m1 宏处理器与 sed 快速参考 1. transpose 脚本 transpose 是一个简单却有趣的脚本,以下是它的测试示例: $ transpose test 1 5 9 2 6 10 3 7 11 4 8 12其程序逻辑是创建一个名为 row 的数组,将每个字段追加到数组元素中,最后通过 END 过程输…

作者头像 李华
网站建设 2026/4/23 16:19:38

Kotaemon能否识别服装搭配?时尚产业智能顾问

Kotaemon能否识别服装搭配&#xff1f;时尚产业智能顾问 在一家高端女装品牌的线上客服后台&#xff0c;一位用户输入&#xff1a;“我身高160&#xff0c;梨形身材&#xff0c;下周要参加婚礼&#xff0c;想要一条显瘦又不失优雅的连衣裙。”传统推荐系统可能只会返回“高腰A字…

作者头像 李华
网站建设 2026/4/18 8:38:41

9、数据库导入Web应用的全流程指南

数据库导入Web应用的全流程指南 1. 建立新关系 在运行查询之后,你可以基于新的主键和外键在两个表之间创建新的关系。具体操作如下: - 在关系图中通过拖放操作,基于每个表中的CustID字段创建一个新的关系,并强制实施引用完整性(可参考相关图示)。 - 无需创建新的查找…

作者头像 李华