vb6 判断打印机是否有效_吊打面试官 | 算法之如何判断括号是否有效?

b187109579d820cdabbef48316036231.png

今天要讲的这道题是 bilibili 今年的笔试真题,也是一道关于栈的经典面试题。

经过前面文章的学习,我想很多朋友已经看出来了,我接下来要写的是一个关于「算法图解」的系列文章,中间可能会穿插少量的其他类型的文章,但「算法和数据结构」会是我今年文章输出的重点内容。

我在写这个算法系列的时候会注意两个问题:

  • 保证算法的解题思路大家都能看懂,因此我会以图片的形式进行思路讲解,这样更直观、更易于理解
  • 在介绍完一个知识点之后,会进行大量的练习,以巩固所学的内容,比如当我讲完「栈」结构之后,我会围绕着「栈」做一系列的经典面试题练习。

学习算法最关键的是掌握解题的思路,只要思路对了,编写代码只是时间的问题。

我们先来回顾一下往期关于「栈」的内容:

  • 《动图演示:手撸堆栈的两种实现方法!》
  • 《JDK 竟然是这样实现栈的?》
  • 《链表反转的两种实现方法,后一种击败了100%的用户!》
  • 《算法图解:如何找出栈中的最小值?》

那么接下来,我们就进入今天的正式内容...

题目

给定一个只包括 '(', ')', '{', '}', '[', ']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"

输出: true

示例 2:

输入: "()[]{}"

输出: true

示例 3:

输入: "(]"

输出: false

示例 4:

输入: "([)]" 输出: false

示例 5:

输入: "{[]}"

输出: true

LeetCode 地址:https://leetcode-cn.com/problems/valid-parentheses

解题思路

这道题考察的是就是验证括号的对称性,比如“([{}])”这种字符串就是正确的,应该返回 true,而“([{})]”这种字符串就是错误的,应该返回 false。

从上面的题目可以看出,括号总共分为三类:小括号、中括号和大括号,那么我们可以利用栈先进后出的特性,将所有左边的括号(“(”、“[”、“{”)先入栈,然后再碰到右括号时,让它与栈顶的元素进行匹配,比如当遇到“)”时,如果栈顶是“(”,则说明匹配成功,栈顶元素出栈再继续字符串循环的流程,如果匹配错误就直接返回 false。

假设我们要匹配字符串“(([]))”是否合法?那么执行流程就是这样的。

首先遇到左边括号,先入栈:

f6c92dbe0004dc197857ce92d5961afc.png

接下来又是左边括号,继续入栈:

30cf68770273582807010f02a6b80d09.png

然后又是左边括号,继续入栈:

dc876b2fc097a667b6920c5c4cd1b63f.png

接下来是右边括号,与栈顶元素匹配,“[]”为一对合法的括号,匹配成功栈顶元素出栈:

3ab723fdfc110ea676a35e85a05a9055.png

接下来又是右边括号,与栈顶元素匹配,“()”为一对合法的括号,匹配成功栈顶元素出栈:

cf48520a08dba75feccd3e16a8729854.png

接下来又是右边括号,与栈顶元素匹配,“()”为一对合法的括号,匹配成功栈顶元素出栈:

89c47bff9033d50c3d2c6d3121348583.png

当字符串循环结束并且栈为空栈时,则证明此字符串的括号匹配合法,最终的效果如下图所示:

6f614f212a718e77758e2bc39d44fcdf.png

那么接下来我们就用代码来实现一下整个过程...

实现代码一

public boolean isValid(String s) {
    int slen = s.length(); // 括号的长度
    if (slen % 2 == 1) { // 括号不是成对出现直接返回 false
        return false;
    }
    // 把所有对比的括号存入 map,对比时用
    Map map = new HashMap<>();
    map.put(')', '(');
    map.put('}', '{');
    map.put(']', '[');// 定义栈,用于存取括号(辅助比较)
    Stack stack = new Stack<>();for (int i = 0; i // 循环所有字符char c = s.charAt(i);if (map.containsKey(c)) { // 为右边的括号,如 ')'、'}' 等if (stack.isEmpty() || stack.peek() != map.get(c)) { // 栈为空或括号不匹配return false;
            }
            stack.pop(); // 是一对括号,执行出栈(消除左右括号)
        } else { // 左边括号,直接入栈
            stack.push(c);
        }
    }return stack.isEmpty();
}

我们在 LeetCode 中提交一下代码,执行结果如下:

92c7f7547f46105db36b917b0f6f491e.png

代码解析

以上代码的 map 集合是用于定义括号的匹配规则,比如“)”对应的匹配值是“(”,“]”的匹配值是“[”等,然后我们再去循环待验证的字符串,遇到左括号直接入栈,遇到右括号让它与栈顶元素匹配,等到整个字符串循环结束,如果栈为空则说明字符串的括号合法。

复杂度分析

时间复杂度:O(n),遍历了一遍整个字符串。空间复杂度:O(n)。

实现代码二

除了使用栈之外,我们还可以使用借助 Java 中的 replace 方法来实现,我们可以循环的消除字符串中的括号,比如将“()”或“[]”或“{}”循环得替换为空,最后在执行完成之后如果字符串为空,则说明字符串中的括号是合法的,具体实现代码如下:

public boolean isValid(String s) {
        int len;
        do {
            len = s.length();
            // 消除成双成对的符号
            s = s.replace("()", "").replace("[]", "").
                    replace("{}", "");
        } while (len != s.length()); // 不能再进行替换了,replace 方法没有替换任何字符
        return s.length() == 0;
    }

我们在 LeetCode 中提交一下代码,执行结果如下:

ac76994f841929ebb6e868234d7bb60d.png

从运行结果来看,二者的执行效率相差还是很明显的:

56a470c262b82a2aa619a8ad6281a260.png

总结

本文我们讲了一道 bilibili 的笔试真题,同时它也是栈的经典面试题,我们可以借助栈的特性(先进后出)将所有的左括号入栈,当遇到右括号时让它与栈顶元素进行匹配,当字符串循环结束栈为空时,则说明此字符串的括号是合法的。当然我们在实际面试中,也可以使用 Java 的 replace 方法作为一个保底的实现方案,因为 replace 方法的实现相对更简单一些,只是性能不怎么好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何理解字符编码

一直有个困惑&#xff0c;为什么计算机系统搞那么多字符编码&#xff0c;就一个Unicode统一天下不就得了&#xff0c;后来看了篇文章&#xff0c;才多少理解一丁点。 英语的国家&#xff0c;只要一个字节就可以表示全部的字符&#xff0c;一个无符合的字节可以表示256个字符&a…

java bean 验证_Java Bean验证基础

java bean 验证这篇文章总结了一些简单&#xff0c;快速的示例&#xff0c;这些示例说明了您想使用Java Beans Validation API&#xff08;JSR 349&#xff0c;JSR 303&#xff09;进行的最常见操作。 记住&#xff0c;Beans Validation独立于Java EE。 尽管它是作为Java EE兼容…

框架下载_25. Scrapy 框架-下载中间件Middleware

1. Spider 下载中间件(Middleware)Spider 中间件(Middleware) 下载器中间件是介入到 Scrapy 的 spider 处理机制的钩子框架&#xff0c;您可以添加代码来处理发送给 Spiders 的 response 及 spider 产生的 item 和 request2. 激活一个下载DOWNLOADER_MIDDLEWARES要激活一个下载…

android activity 显示无焦点_Android面试题集锦之fragemnt

大家可以关注一下小编&#xff0c;小编以后会一直更新Android相关技术资料文章。创建方式静态创建首先我们需要创建一个xml文件&#xff0c;然后创建与之对应的java文件&#xff0c;通过onCreatView()的返回方法进行关联&#xff0c;最后我们需要在Activity中进行配置相关参数即…

IntelliJ IDEA for Mac 在eclipse(MacOS)模式下的快捷键

文章目录Mac键盘符号eclipse(MacOS)模式下的快捷键General 通用Debugging 调试Search/ Replace 查询/替换Editing 编辑Refactoring 重构Navigation 导航Usage Search 使用查询VCS/ Local History 版本控制/本地历史记录Live Templates 动态代码模板Other 官方文档上没有体现Mac…

java终结器_弃用Java的终结器

java终结器JDK-8165641 &#xff08;“ Deprecate Object.finalize”&#xff09;已打开&#xff0c;以“ deprecate Object.finalize&#xff08;&#xff09; ”&#xff0c;因为“ finalizer本质上存在问题&#xff0c;使用finalizer可能会导致性能问题&#xff0c;死锁&…

node 安装_VUE项目迁移之node.js的安装

【摘要】由于公司的项目需要迁移到VUE中去, 所以就用到了node.js, 这里简单整理了一下node.js的安装教程和环境变量的配置【作者】田鋆鹏Node.js 安装教程1. 在node.js的官网下载安装包下载地址1: https://nodejs.org/en/下载地址2: http://nodejs.cn/直接下载.msi的安装包即可…

jsp mysql servlet_JSP+Servlet+JDBC+mysql实现的学生成绩管理系统

本系统基于JSPServletMysql一个基于JSPServletJdbc的学生成绩管理系统。涉及技术少&#xff0c;易于理解&#xff0c;适合JavaWeb初学者学习使用。难度等级&#xff1a;入门技术栈编辑器Eclipse Version: 2019-12 (4.14.0)前端技术基础&#xff1a;htmlcssJavaScript框架&#…

IntelliJ IDEA for Mac 彻底卸载/彻底删除

删除 /Users/liaowenxiong/Library/Logs/目录下所有与 IntelliJ IDEA 相关的文件&#xff1a; cd /Users/liaowenxiong/Library/Logs/ rm -rf *intellij* rm -rf *IntelliJ* rm -rf *JetBrains* rm -rf *jetbrains*删除 /Users/liaowenxiong/Library/Preferences/目录下所有与…

春天猫rtsy_春天重试,因为冬天来了

春天猫rtsy好的&#xff0c;这实际上与冬天无关&#xff0c;众所周知&#xff0c;冬天已经到了 。 它与Spring Retry有关&#xff0c;Spring Retry是一个小的Spring框架库&#xff0c;它使我们可以向应重试的任何任务添加重试功能。 这里有一个很好的教程 &#xff0c;解释了如…

mariadb mysql 配置文件_MariaDB/MySQL配置文件my.cnf解读

MariaDB/MySQL的默认设置性能非常差&#xff0c;仅仅起一个功能测试的作用&#xff0c;不能用在生产环境中&#xff0c;因此要对一些参数进行调整优化。当然&#xff0c;对配置文件各参数的调整需要根据实际环境&#xff0c;不同时期不同数量级的数据进行性能优化。MySQL/Maria…

python字符串合并去重_015day--python集合和字符串

一、集合关系测试交集&#xff1a; 两个都有 .intersettion() 或用 & 符号差集&#xff1a; 列表a有&#xff0c;列表b没有 .difference() 或用 - 符号并集&#xff1a; 两列表合并&#xff0c;去重 .union() 或用 | 符号合并&#xff1a; .update() 会更改数据…

IntelliJ IDEA for Mac如何存取自定义快捷键配置文件

IntelliJ IDEA for Mac自定义的快捷键配置文件在以下的目录中&#xff1a; /Users/liaowenxiong/library/application support/JetBrains/IntelliJIdea2020.3/keymaps

react 事件处理_在React中处理事件

react 事件处理在使用React渲染RESTful服务后&#xff0c;我们创建了简单的UI&#xff0c;用于渲染从RESTful服务获取的员工列表。 作为本文的一部分&#xff0c;我们将扩展同一应用程序以支持添加和删除员工操作。 我们将通过添加/删除员工操作来更新react-app后端api&#x…

linux mysql 分区_Linux :linux磁盘分区(普通分区2T以内),安装免安装版mysql(tar.gz)...

1关闭防火墙&#xff1a;(依次运行 停止-->禁用)Centos7使用firewalld&#xff1a;启动&#xff1a;systemctl start firewalld查看状态&#xff1a;systemctl status firewalld停止&#xff1a;systemctl disable firewalld禁用&#xff1a;systemctl stop firewalld2官网下…

python 3d大数据可视化软件_十大顶级大数据可视化工具推荐

要使数据分析真正有价值和有洞察力&#xff0c;就需要高质量的可视化工具。市场上有很多产品&#xff0c;特点和价格各不相同&#xff0c;本文列出了一些广泛认可的工具。其实企业如何选择一个合适的可视化工具&#xff0c;并不是一件容易的事情&#xff0c;需要仔细的考虑。据…

IntelliJ IDEA 配置文件位置

1 IDEA 2020.1 以上 1.1 Win 语法&#xff1a; %APPDATA%\JetBrains\<product><version>Win上的APPDATA默认位置如下&#xff1a; C:\Users\用户名\AppData\Roaming例子&#xff1a; C:\Users\用户名\AppData\Roaming\JetBrains\IntelliJIdea2020.11.2 MacOS …

mysql 中间表的好处_Mysql中使用中间表提高统计查询速度

对于数据量较大的表&#xff0c;在其上进行统计查询通常会效率很低&#xff0c;并且还要考虑统计查询是否会对在线的应用产生负面影响。通常在这种情况下&#xff0c;使用中间表可以提高统计查询的效率&#xff0c;下面通过对session 表的统计来介绍中间表的使用&#xff1a;(1…

junit 5测试异常处理_使用JUnit 5测试异常

junit 5测试异常处理JUnit 5带来了令人敬畏的改进&#xff0c;并且与以前的版本有很大不同。 JUnit 5在运行时需要Java 8&#xff0c;因此Lambda表达式可以在测试中使用&#xff0c;尤其是在断言中。 这些断言之一非常适合测试异常。 设置项目 为了演示JUnit 5的用法&#xff…

多元回归求解 机器学习_金融领域里的机器学习算法介绍:人工神经网络

人工智能的发展在很大程度上是由神经网络、深度学习和强化学习推动的。这些复杂的算法可以解决高度复杂的机器学习任务&#xff0c;如图像分类、人脸识别、语音识别和自然语言处理等。这些复杂任务一般是非线性的&#xff0c;同时包含着大量的特征输入。我们下面我们将分几天的…