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

LeetCode力扣每日一题(Java):20、有效的括号

一、题目

二、解题思路

1、我的思路

我看到题目之后,想着这可能是力扣里唯一一道我能秒杀的题目了

于是一波操作猛如虎写出了如下代码

public boolean isValid(String s) {
        char[] c = s.toCharArray();
        for(int i=0;i<c.length;i++){
            switch (c[i]){
                case '(':
                    if(c[++i]!=')')
                        return false;
                    break;
                case '[':
                    if(c[++i]!=']')
                        return false;
                    break;
                case '{':
                    if(c[++i]!='}')
                        return false;
                    break;
            }
        }
        return true;
    }

运行的时候三个测试用例都通过了,我心想这把稳了。信心满满地点击提交……

什么?!解答错误

嗷,那没事了,原来左括号后不一定跟的是右括号……这就回去重写

再仔细一思考,猛然回想起当时学数据结构的时候遇到过的括号匹配问题。这可能要用到栈,遇到左括号就让这个左括号进栈,遇到右括号就出栈一个括号,如果这两个括号能匹配就继续执行,反之则直接返回false

于是有了如下的代码,而且这段代码的运行效率竟然击败了98%的用户

char[] sc = s.toCharArray();
        Stack<Character> stack = new Stack<>();
        for(int i=0;i<sc.length;i++){
            switch (sc[i]){
                case '(':
                case '{':
                case '[':
                    stack.push(sc[i]);
                    break;
                default:
                    if(stack.size()==0){
                        return false;
                    }
                    switch(stack.pop()){
                        case '(':
                            if(sc[i]!=')')
                                return false;
                            break;
                        case '{':
                            if(sc[i]!='}')
                                return false;
                            break;
                        case '[':
                            if(sc[i]!=']')
                                return false;
                            break;
                    }
            }
        }
        if(stack.size()!=0){
            return false;
        }
        return true;

 只不过我一开始没有考虑到循环中的

if(stack.size()==0){
    return false;
}

和循环结束的

if(stack.size()!=0){
    return false;
}

导致代码在测试 "[" 和 "]" 两个测试用例的时候都返回了错误的结果,还好力扣上可以看到出错的执行用例,所以我才能很快地找到问题

但是有很多算法竞赛是看不到执行出错的测试用例的,所以在打算法竞赛时,如果我们提交的代码出现了问题,不妨自己输入一些数据进行测试,而且要输入比较特殊的例子,如 "[" 和 "]" 这样的极端例子

2、官方题解

class Solution {
    public boolean isValid(String s) {
        int n = s.length();
        if (n % 2 == 1) {
            return false;
        }

        Map<Character, Character> pairs = new HashMap<Character, Character>() {{
            put(')', '(');
            put(']', '[');
            put('}', '{');
        }};
        Deque<Character> stack = new LinkedList<Character>();
        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            if (pairs.containsKey(ch)) {
                if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
                    return false;
                }
                stack.pop();
            } else {
                stack.push(ch);
            }
        }
        return stack.isEmpty();
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/valid-parentheses/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三、栈

考虑到可能也有一些小伙伴不会用栈,在这里给大家科普一下(图片来源于《labuladong的算法笔记》)


http://www.kler.cn/a/162269.html

相关文章:

  • 01:(手撸HAL+CubeMX)时钟篇
  • 【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)
  • HBase使用create创建表时报错ERROR: KeeperErrorCode = NoNode for /hbase/master
  • 前端请求后端php接口跨域 cors问题
  • linux设置主机名
  • 探索Pillow库:Python图像处理的瑞士军刀
  • 教师未来发展前景如何
  • 消息队列 - RabbitMQ
  • Elasticsearch、Logstash、Kibana(ELK)环境搭建
  • 阿里云通义千问720亿参数模型开源,适配企业级、科研级高性能应用
  • 2023第十二届“认证杯”数学中国数学建模国际赛赛题A完整解析
  • 文本润色工具有哪些,高质量的文本润色软件
  • 57、postgresql 查询流程
  • 聊聊模糊测试,以及几种模糊测试工具的介绍!
  • 解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
  • win10编译golang程序报病毒错误
  • js中数组对象去重的方法
  • 【mysql】事物与隔离级别
  • CKafka 一站式搭建数据流转链路,助力长城车联网平台降低运维成本
  • 模块式雨水调蓄池施工简单,无需大型机械,可实现当天开挖当天回填
  • Python Appium Selenium 查杀进程的实用方法
  • 微信小程序 - PC端选择ZIP文件
  • 微软 Power Platform 零基础 Power Pages 网页搭建实际案例实践(三)
  • 013 OpenCV copyMakeBorder(padding)
  • vscode如何在没有网络的情况下安装插件
  • Python 中 Thread 线程的用法