【算法题解】14. 有效的括号

news2024/11/23 22:16:45

文章目录

    • 题目
    • 解法:使用栈的特性
      • Java 代码实现
      • Go 代码实现
      • 复杂度分析

这是一道 简单 题。
来自:leetcode

题目

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:
s 仅由括号 ‘()[]{}’ 组成

解法:使用栈的特性

有效字符串可以使用 栈的特性(先进后出,后进先出) 来解题。

  • 当遇到 左括号‘(’‘[’‘{’)时入栈。
  • 当遇到 右括号‘)’‘]’‘}’)时:
    • 若此时栈为空,直接返回false。因为前面没有和这个右括号匹配的左括号。
    • 若此时栈顶元素和当前右括号不是一对,直接返回false
    • 若此时栈顶元素和当前右括号成对,栈顶元素出栈,然后继续遍历字符串中的下一个元素。
  • 当将整个字符串遍历完成后:
    • 如果此时栈为空,返回true
    • 如果此时栈不空,返回false。此时栈中的前括号没有对应的后括号与之成对。

以有效的括号 ‘([]{})’为例动图展示:
算法题解 - 有效的括号

Java 代码实现

使用 HashMap 存放成对的 前后括号,使用时可以直接根据 后括号 获取到与之对应的 前括号

class Solution {
    public boolean isValid(String s) {

        if(s.length() % 2 != 0){
            return false;
        }

        Map<Character, Character> pairs = new HashMap<>();
        pairs.put(')', '(');
        pairs.put(']', '[');
        pairs.put('}', '{');

        Deque<Character> stack = new LinkedList<>();

        for(char c : s.toCharArray()){
            if(pairs.containsKey(c)){
                if(stack.isEmpty() || stack.peek() != pairs.get(c)){
                    return false;
                }
                stack.pop();
            }else{
                stack.push(c);
            }
        }

        return stack.isEmpty();

    }
}

Go 代码实现

因为Go语言本身没有实现栈这个数据结构,所以我们用切片代替,思路是一样的。

func isValid(s string) bool {
    n := len(s)
    if n % 2 != 0 {
        return false
    }
    pairs := map[byte]byte{
        ')': '(',
        ']': '[',
        '}': '{',
    }
    stack := []byte{}
    for i := 0; i < n; i++ {
        if pairs[s[i]] > 0 {
            if len(stack) == 0 || stack[len(stack)-1] != pairs[s[i]] {
                return false
            }
            stack = stack[:len(stack)-1]
        } else {
            stack = append(stack, s[i])
        }
    }
    return len(stack) == 0
}

复杂度分析

时间复杂度 O ( N ) O(N) O(N),N 为字符串长度。
空间复杂度 O ( N ) O(N) O(N),N 为字符串长度。paris 空间复杂度为常数,stack 空间复杂度为 N。

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

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

相关文章

哈工大操作系统学习笔记(二)进程与线程

文章目录CPU管理的直观想法多进程图像用户级线程内核级线程内核级线程实现操作系统之树CPU 调度策略一个实际的schedule 函数进程同步与信号量信号量临界区保护信号量的代码实现死锁处理CPU管理的直观想法 CPU的工作原理&#xff1a; 自动的取值执行&#xff0c;给了初始地址&…

Swift 周报 第二十一期

前言 本期是 Swift 编辑组自主整理周报的第十二期&#xff0c;每个模块已初步成型。各位读者如果有好的提议&#xff0c;欢迎在文末留言。 Swift 周报在 GitHub 开源&#xff0c;欢迎提交 issue&#xff0c;投稿或推荐内容。目前计划每两周周一发布&#xff0c;欢迎志同道合的…

永久删除的照片怎么找回来?教你三招恢复方法

如果文件被永久删除了&#xff0c;想要恢复就没有这么简单了&#xff0c;永久删除的文件可能是已经从回收站清空的文件&#xff0c;或者是我们按住快捷键“shiftdelete”快捷键删除的文件&#xff0c;这样的话&#xff0c;我们无法在电脑上面查找到文件&#xff0c;潜意识里面认…

SAP ABAP SY-REPID 变化「Note」

6.10 前&#xff08;知悉&#xff09; SY-CPROG The name of the calling program in an external routine, otherwise the name of the current program. 外部例程中调用程序的名称&#xff0c;否则为当前程序的名称 SY-REPID Name of the current ABAP program. For externa…

第一章-操作系统引论

&#x1f31e;欢迎来到操作系统的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff…

解决数据兼容性问题

数据兼容性问题解决 问题说明 最近经常遇到新老数据兼容性的问题&#xff1a;某些新同事更改代码后&#xff0c;没有兼容旧数据&#xff0c;已有用户的数据显示不全或者错误&#xff0c;很麻烦。 技术层面&#xff0c;就是某个数据或者字段&#xff0c;存储在服务器上&#…

java后端工程师面试题(笔试):2022-11-04 经历(一)

java后端工程师面试题&#xff08;笔试&#xff09;&#xff1a;2022-11-04&#xff1a; 面试题&#xff1a;总分100 1、关于盒子模型(5分) 1&#xff09;盒子模型的种类有几种?分别是什么?(1分) 2种&#xff0c;分别是1、W3C标准盒子模型 2、IE盒子模型2) 容器中使用di…

射频已调波同步广播技术在山区高速公路同步广播建设中的应用

北京恒星科通发布于2023-2-2 我国高速公路建设速度的加快&#xff0c;目前我国已经建成通车的高速公路总里程已经达到14万公里&#xff0c;高速公路的安全与信息化建也达到了快速发展&#xff0c;高速公路调频广播覆盖一直是困扰高速公路管理方的一个重要问题&#xff0c;我国…

实时分析全面赋能金融业务,马上消费基于 Apache Doris 构建实时数仓的实践

导读&#xff1a; 近年来&#xff0c;马上消费的业务体量呈飞跃式增长&#xff0c;每天产生数据可达上千亿条&#xff0c;如何更高效挖掘这些数据的价值&#xff0c;成为了其必须要面临的挑战。随着各业务对实时数据分析的需求越来越强烈&#xff0c;马上消费于 2021 年引入 Ap…

点云处理指南介绍

目录 一、点云处理介绍&#xff1a; 二、Open3D文章目录&#xff1a; Open3D几何部分&#xff08;Geometry&#xff09; 点云处理&#xff08;点云IO/可视化/数据结构/下采样/凸包计算/裁减/法向量估计/聚类/隐藏点移除/平面分割/最小外接矩形/外点移除&#xff09; 面片&…

HTML5+CSS3(三)-全面详解(学习总结---从入门到深化)

目录 Form表单 表单元素 学习效果反馈 表单元素一 文本框 密码框 单选按钮 学习效果反馈 表单元素二 复选框 文件 提交按钮 重置按钮 学习效果反馈 表单元素三 下拉列表 多行文本框 label 学习效果反馈 HTML5新增type类型一 url search tel color 学习效果反馈 HTML5新增…

「Python|网页开发」如何使用Django快速开始进行网页开发:写个Hello World!

本文主要介绍如何从零开始借助django框架快速启动一个网页服务器然后进入编写HTML页面的阶段。 文章目录安装django创建并启动网页项目在网页项目中创建一个应用创建页面并设置好对应关系安装django Django是Python的一个第三方库&#xff0c;里面已经将编写网页需要的代码结构…

如何更改报表控件 Stimulsoft BI 服务器中的地址和端口?

在本文中&#xff0c;我们将主要讨论如何在 Stimulsoft BI Server 中设置基本参数&#xff0c;具体来说&#xff0c;也就是如何更改服务器的地址和端口&#xff1f; 为什么需要更改服务器地址和端口&#xff1f; 在部署报表服务器时&#xff0c;需要指定其地址&#xff0c;实…

使用Websockets和Vert.x进行实时竞价

翻译: 白石(https://github.com/wjw465150/Vert.x-Core-Manual) 原文地址: https://vertx.io/blog/real-time-bidding-with-websockets-and-vert-x/ 在过去的几年中&#xff0c;用户对网络应用程序的期望发生了变化。在拍卖竞价过程中&#xff0c;用户不再需要按下刷新按钮来检…

【C++】STL — map和set的介绍 + 使用

文章目录&#x1f4d6; 前言1. 键值对的引入⚡2. 树形结构的关联式容器&#x1f31f;3. set的介绍 使用⭐4. map的介绍 使用⭐&#x1f3c1;4.4.1 利用map统计次数&#xff1a;&#x1f3c1;4.4.2 std::map::operator[]&#x1f4d6; 前言 本章将继续学习STL中的两个很重要的…

23.2.2打卡 2023牛客寒假算法基础集训营5 ABCDHKL 最详细的一集

A 这题据说可以贪心写 我为了省事直接upper二分第一个大于x的商品然后向前遍历完事 /* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠸⣿⣿⣆⠹⣿⣿⢾⣟⣯⣿⣿⣿⣿⣿⣿⣽⣻⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣻⣽⡿⣿⣎⠙⣿⣞⣷⡌⢻⣟⣿⣿⣿⣿⣿⣿⣿…

使用动态创建pinia时报injection “Symbol(pinia)“ not found

前阵发现项目内用pinia报了injection "Symbol(pinia)" not found这个错误&#xff0c;因为前一阵用并没有这个问题。问了相关同事后发现是他新建了节点后调用的&#xff0c;导致的问题。 出现的警告如下图&#xff1a; 这问题排除了比较久&#xff0c;为什么呢&…

python自动化办公--pyautogui控制鼠标和键盘操作

在公司某些工作场景下&#xff0c;需要大量重复的工作&#xff0c;重复的工作完全可以通过python软件的自动化实现&#xff0c;省时省力。本文分享python自动化办公的利器之一--pyautogui&#xff0c;通过pyautogui可以轻松控制鼠标和键盘操作。 PyAutoGUI是一个纯Python的GUI自…

纯滞后系统的大林控制算法

大林控制算法原理早在1968年&#xff0c;美国IBM公司的大林&#xff08;Dahlin&#xff09;就提出了一种不同于常规PID控制规律的新型算法&#xff0c;即大林算法。该算法的最大特点是将期望的闭环响应设计成一阶惯性加纯延迟&#xff0c;然后反过来得到能满足这种闭环响应的控…

Linux服务器之间设置共享目录

前言有时候我们需要在两台linux服务器之间共享资源&#xff0c;例如在服务器A上面部署了一个大文件上传程序&#xff0c;但是需要将文件上传到服务器B的某个目录下面&#xff0c;因为上传大文件&#xff0c;需要先将文件所有分块单独上传到服务器B&#xff0c;然后在服务器B上面…