Leetcode的AC指南 —— 栈与队列:20. 有效的括号

摘要:
**Leetcode的AC指南 —— 栈与队列:20. 有效的括号 **。题目介绍:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

文章目录

  • 一、题目
  • 二、解析 (go语言版)
    • 1、针对每个字符进行配对
    • 2、使用字典进行字符配对
  • 三、其他语言版本
    • Java
    • C++
    • Python

一、题目


题目介绍:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

力扣题目链接

示例 1:

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

示例 2:

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

示例 3:

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

提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成

二、解析 (go语言版)


有三种括号不匹配的情况:

  • 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
    在这里插入图片描述

第二种情况,括号没有多余,但是 括号的类型没有匹配上。

在这里插入图片描述

  • 第三种情况,字符串里右方向的括号多余了,所以不匹配。
    在这里插入图片描述
  • 动画演示:
    在这里插入图片描述

第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false

第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false

第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false

那么什么时候说明左括号和右括号全都匹配了呢,就是字符串遍历完之后,栈是空的,就说明全都匹配了。

1、针对每个字符进行配对


func isValid(s string) bool {
	stack := make([]byte, 0) // 初始化栈
	for i := 0; i < len(s); i++ {
		if s[i] == '(' {
			stack = append(stack, ')')
		} else if s[i] == '[' {
			stack = append(stack, ']')
		} else if s[i] == '{' {
			stack = append(stack, '}')
		} else if len(stack) == 0 || stack[len(stack)-1] != s[i] { 
			// 在存入)]}右括号中的任意一个时,
			// 如果堆为空,说明这个右括号多余了
			// 如果右括号不等于堆顶元素,说明括号不匹配
			return false
		} else { // 左右括号匹配,将堆顶弹出
			stack = stack[:len(stack)-1]
		}
	}
	// 如果堆为空,说明左右括号都匹配上了
	// 如果堆不为空,说明左括号多了
	return len(stack) == 0 
}

2、使用字典进行字符配对

func isValid(s string) bool {
    hash := map[byte]byte{')':'(', ']':'[', '}':'{'} 
    stack := make([]byte, 0) // 初始化栈
    if s == "" {
        return true
    }

    for i := 0; i < len(s); i++ {
    	
        if s[i] == '(' || s[i] == '[' || s[i] == '{' {
        	// 将左括号入栈
            stack = append(stack, s[i])
        } else if len(stack) > 0 && stack[len(stack)-1] == hash[s[i]] {
        	// 在处理右括号时,如果栈不空,并且栈顶括号与单前右括号匹配,则弹出栈顶元素
            stack = stack[:len(stack)-1]
        } else {
        	// 在处理右括号时,如果栈为空或者栈顶括号与单前右括号不匹配,则返回false
            return false
        }
    }
    // 如果堆为空,说明左右括号都匹配上了
	// 如果堆不为空,说明左括号多了
    return len(stack) == 0
}

三、其他语言版本


Java

class Solution {
    public boolean isValid(String s) {
        Deque<Character> deque = new LinkedList<>();
        char ch;
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);
            //碰到左括号,就把相应的右括号入栈
            if (ch == '(') {
                deque.push(')');
            }else if (ch == '{') {
                deque.push('}');
            }else if (ch == '[') {
                deque.push(']');
            } else if (deque.isEmpty() || deque.peek() != ch) {
                return false;
            }else {//如果是右括号判断是否和栈顶元素匹配
                deque.pop();
            }
        }
        //最后判断栈中元素是否匹配
        return deque.isEmpty();
    }
}

C++


class Solution {
public:
    bool isValid(string s) {
        if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求
        stack<char> st;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(') st.push(')');
            else if (s[i] == '{') st.push('}');
            else if (s[i] == '[') st.push(']');
            // 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
            // 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
            else if (st.empty() || st.top() != s[i]) return false;
            else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
        }
        // 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
        return st.empty();
    }
};

Python

# 方法一,仅使用栈,更省空间
class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        
        for item in s:
            if item == '(':
                stack.append(')')
            elif item == '[':
                stack.append(']')
            elif item == '{':
                stack.append('}')
            elif not stack or stack[-1] != item:
                return False
            else:
                stack.pop()
        
        return True if not stack else False

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统中内核音频驱动实现

本文以I2S接口为例介绍Linux内核音频相关知识。 一、名词介绍 下面是音频调试中常见的名词缩略语。 1、AEC&#xff08;Acoustic Echo Cancellor&#xff09;&#xff1a;回声消除。 2、AGC&#xff08;Automatic Gain Control&#xff09;&#xff1a;自动增益补偿&#xf…

ZEM20台式扫描电子显微镜在三元材料锂电池中的应用

在当今环保能源需求日益增长的背景下&#xff0c;新型储能材料特别是锂离子电池在新能源汽车和移动互联网设备中的应用越来越广泛。其中&#xff0c;以镍钴锰三元素为基础的分层材质因具有体系能量密度高、原材料来源广、合成过程相对简单等优势&#xff0c;被公认为最有应用前…

字符串展开(Python)

展开字符串中用-压缩的连续小写字母或者数字&#xff0c;不是压缩形式的-不用理会&#xff0c;-没有压缩字符的去除-。 (笔记模板由python脚本于2024年01月21日 18:18:19创建&#xff0c;本篇笔记适合熟悉 p y t h o n python python字符串和列表的coder翻阅) 【学习的细节是欢…

Java线程池七大参数详解和配置(面试重点)

一、corePoolSize核心线程数 二、maximunPoolSize最大线程数 三、keepAliveTime空闲线程存活时间 四、unit空闲线程存活时间的单位 五、workQueue线程工作队列 1、ArrayBlockingQueue FIFO有界阻塞队列 2、LinkedBlockingQueue FIFO无限队列 3、PriorityBlockingQueue V…

2023年度环境电器行业数据分析(洗地机、扫地机器人、吸尘器等)

在家电行业整体消费不振的环境下&#xff0c;环境电器市场也受到影响&#xff0c;2023年度市场大盘销售呈下滑趋势。根据鲸参谋平台的数据显示&#xff0c;2023年京东平台环境电器市场的销量累计约7100万&#xff0c;同比下滑约12%&#xff1b;销售额约360亿&#xff0c;同比下…

二.用户和权限管理(一)

用户和管理权限 1.用户管理1.1登录MySQL服务器1.2创建用户1.3修改用户1.4删除用户1.5设置当前用户密码1.6 修改其它用户密码 2.权限管理2.1权限列表2.2授予权限的原则2.3授予权限2.4产看权限2.5收回权限 3.权限表3.1user表3.2db表3.3tables_priv表和columns_priv表3.4procs_pri…

【iOS】UICollectionView使用

使用UITableView作为表格来展示数据完全没有问题&#xff0c;但仍有许多局限性&#xff0c;对于一些更加复杂的布局样式&#xff0c;就有些力不从心了 比如&#xff0c;UITableView只允许表格每一行只能显示一个cell&#xff0c;而不能在一行中显示多个cell&#xff0c;对于这…

IN操作符

目录 IN NOT IN Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 IN IN 指的是根据一个指定的范围进行数据查询 1.查询出员工编号是 7369、7566、7788、9999 的员工信息 利用前面学的知识,得出: SQL> set linesize 250 SQL>…

​第14节-高质量简历写作求职通关-在线测试

在线测试主要包括性格测试、综合能力测试、技能测试三类 性格测试 性格测试主要用于考察个人与工岗位的匹配程度 考察内容包含性格、能力、动机、价值观等&#xff0c;考察形式一般为给出相应的工作场景&#xff0c;让你选择最喜欢或者最不喜欢的答案 技能考试 这类测试一般是针…

Windows云服务器如何配置多用户登录?(Windows 2012)华为云官方文档与视频地址

Windows云服务器如何配置多用户登录&#xff1f;&#xff08;Windows 2012&#xff09;_弹性云服务器 ECS_故障排除_多用户登录_华为云 打开任务栏左下角的“服务器管理器”&#xff0c;在左侧列表中选中“本地服务器” 然后将右侧“远程桌面”功能的选项修改为“启用”&#x…

LeetCode 13.罗马数字转整数(python版)

需求 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1 。12 写做 XII &#xff0c;即为 X …

如何对遗留 C++ 代码进行现代化改造?

C 在过去的十年中进步很大&#xff0c;以至于有些人把它看作是一种完全不同的语言&#xff0c;而不是“老旧的遗留 C”。尽管现代 C 依然保留了与原来的准则和基本语法&#xff0c;但这些更新和进步对 C 语言和标准库意义重大。 不过&#xff0c;也不是每个人都在使用最新版本…

Unity 工厂方法模式(实例详解)

文章目录 在Unity中&#xff0c;工厂方法模式是一种创建对象的常用设计模式&#xff0c;它提供了一个接口用于创建对象&#xff0c;而具体的产品类是由子类决定的。这样可以将对象的创建过程与使用过程解耦&#xff0c;使得代码更加灵活和可扩展。 工厂模式的主要优点如下&…

快速排序(三)——hoare法

目录 ​一.前言 二.快速排序 hoare排法​ 三.结语 一.前言 本文给大家带来的是快速排序&#xff0c;快速排序是一种很强大的排序方法&#xff0c;相信大家在学习完后一定会有所收获。 码字不易&#xff0c;希望大家多多支持我呀&#xff01;&#xff08;三连&#xff0b;关…

PADS自动导出Gerber文件 —— 双面板

视频地址&#xff1a;PADS_2层PCB板(双面板) 快速出GERBER光绘文件实战视频教程_哔哩哔哩_bilibili 像pads做封装不用做阻焊层&#xff0c;因为在出GERBER文件的时候调用了焊盘&#xff0c;并在焊盘的基础上增加了几个mil来做阻焊层。 出Gerber文件之前一定要先铺铜并且检查无错…

双指针算法专题

前言 双指针算法入门&#xff0c;干就完了 下面的题目都是来自灵神的基础算法精讲&#xff0c;有思路不清晰的地方&#xff0c;可以去看讲解。 灵茶山艾府的个人空间-灵茶山艾府个人主页-哔哩哔哩视频 (bilibili.com) 相向双指针 1.两数之和 题目链接&#xff1a;167. 两数之…

清华大模型Chatglm2-6B的微调方法和微调模型使用方式(非常仔细,值得借鉴)

一、下载chatglm2-6b的项目代码和模型 1、下载chatglm2-6b的项目 方法一、chatglm2-6b的项目下载地址&#xff1a; https://github.com/THUDM/ChatGLM2-6B方法二、百度网盘提取chatglm2-6b的项目&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BEwUhiIJlB4SJrGw7N…

力扣:474. 一和零(动态规划)(01背包)

题目&#xff1a; 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#…

MacOS受欢迎的数据库开发工具 Navicat Premium 15 中文版

Navicat Premium 15 Mac是一款数据库管理工具&#xff0c;提供了一个全面的解决方案&#xff0c;用于连接、管理和维护各种数据库系统。以下是Navicat Premium 15 Mac的一些主要功能和特点&#xff1a; 软件下载&#xff1a;Navicat Premium 15 中文版下载 多平台支持&#xff…

【UE5】第一次尝试项目转插件(Plugin)的时候,无法编译

VS显示100条左右的错误&#xff0c;UE热编译也不能通过。原因可能是[名字.Build.cs]文件的错误&#xff0c;缺少一些内容&#xff0c;比如说如果要写UserWidget类&#xff0c;那么就要在 ]名字.Build.cs] 中加入如下内容&#xff1a; public class beibaoxitong : ModuleRules …