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 {// 在处理右括号时,如果栈为空或者栈顶括号与单前右括号不匹配,则返回falsereturn 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 falseelse if (st.empty() || st.top() != s[i]) return false;else st.pop(); // st.top() 与 s[i]相等,栈弹出元素}// 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return truereturn 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 Falseelse:stack.pop()return True if not stack else False

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

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

相关文章

统计指定整数的二进制中1的个数

package com.zttexercise;public class test {public static void main(String[] args) {int n125;int retbitCount(125);System.out.printf("整数%d存在%d个1\n",n,ret);System.out.printf("整数%d存在%d个1\n",n,Integer.bitCount(n));// TODO Auto-gene…

901. 滑雪

#include<bits/stdc.h>using namespace std;const int N310;int n,m; int g[N][N];//高度数组 int f[N][N];//答案数组int dx[4]{-1,0,1,0},dy[4]{0,1,0,-1};int dp(int x,int y) {int &vf[x][y];if(v!-1) return v;v1;for(int i0;i<4;i){int axdx[i],bydy[i];i…

推荐收藏!Python Flask 项目生产环境部署指南

Flask 是一个轻量级的 Python web 框架&#xff0c;适合快速地开发小型到中型的web应用。 本文将详细介绍如何将Flask应用部署到生产环境中。文末有技术交流和练手项目&#xff0c;喜欢去练习一下 开始之前 在部署Flask应用之前&#xff0c;确保你有以下几点&#xff1a; 一…

CMeet系列技术生态沙龙---城市开发者组织年度聚会·杭州 《把握未来趋势,持续学习创新》

CSDN始终致力于促进城市区域内尖端新兴技术开发者交流,提供开放自由的切磋平台。在这个充满挑战和机遇的一年即将结束之际&#xff0c;通过本次聚会&#xff0c;汇聚杭州本地各行各业的开发者朋友&#xff0c;回顾过去一年城市社区的成就和收获&#xff0c;感谢携手同行的各位,…

Vue-Router: 如何使用路由钩子函数来处理路由变化

Vue-Router 是 Vue.js 官方的路由管理插件&#xff0c;它能够帮助我们在 Vue.js 应用中实现单页应用的路由功能。除了基本的路由导航功能外&#xff0c;Vue-Router 还提供了一系列的钩子函数&#xff0c;让我们能够在路由变化时进行相应的操作。本文介绍 Vue-Router 的钩子函数…

makefile的机制,执行命令的流程分析

makefile的机制&#xff0c;流程分析 calc:add.o sub.o multi.ogcc add.o sub.o multi.o calc.cpp -o calcadd.o:add.cppgcc -c add.cpp -o add.osub.o:sub.cppgcc -c sub.cpp -o sub.omulti.o:multi.cppgcc -c multi.cpp -o multi.oclean:rm -rf *.o calc按照这个例子分析&am…

常见网站结构

网站架构与部署架构 1、初始阶段的网站架构 一般来讲&#xff0c;大型网站都是从小型网站发展而来&#xff0c;一开始的架构都比较简单&#xff0c;随着业务复杂和用户量的激增&#xff0c;才开始做很多架构上的改进。当它还是小型网站的时候&#xff0c;没有太多访客&#…

数据结构之栈和队列

数据结构之栈和队列 1、栈1.1、栈的定义及基本运算1.2、栈的存储结构 2、队列2.1、队列的定义及基本运算2.2、队列的存储结构2.3、队列的应用 数据结构是程序设计的重要基础&#xff0c;它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从…

FDM3D打印系列——宝可梦妙蛙种子

fdm打印妙蛙种子 大家好&#xff0c;我是阿赵。   每次打印3D模型&#xff0c;都有新的感觉&#xff0c;这次打印了个宝可梦里面的妙蛙种子&#xff0c;也就是俗称的蒜头王八。   先来看看成果&#xff0c;然后在后面再聊一下关于3D打印的一些体会。使用创想三维的Sermoon …

华为机考入门python3--(0)测试题1-句子平均重量

分类&#xff1a;字符串 知识点&#xff1a; 获取输入 input().strip().split(" ") 拼接列表 " ".join(list) 输出指定位数的浮点数 print("%.2f" % value) 题目来自【华为招聘模拟考试】 # If you need to import additional packages or c…

Dell戴尔XPS 8930笔记本电脑原装Win10系统 恢复出厂预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/1eaTQeX-LnPJwWt3fBJD8lg?pwdajy2 提取码&#xff1a;ajy2 原厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 文件格式&#xff1a;esd/wim/swm 安装方式&am…

String字符串的比较和hash函数减少哈希冲突

1.为什么比较字符串通过hash值比通过字符串本身效率更高 比较两个字符串的哈希值相对于比较两个字符串本身的效率更高&#xff0c;原因如下&#xff1a; 哈希函数具有快速计算的特性&#xff1a;哈希函数可以将一个字符串转换为一个固定长度的哈希值。这个转换过程通常是非常…

源码分享-golang的BMP文件读写库

用于读写BMP文件的golang版源码 源码基于源码分享-golang的二进制文件读写库 https://blog.csdn.net/zhyulo/article/details/128890546 BMP文件格式可参考位图文件解析-位图(bmp)、图标(ico)与光标(cur) https://blog.csdn.net/zhyulo/article/details/85934728 import (&q…

一文梳理金融风控建模全流程(Python)

▍目录 一、简介 风控信用评分卡简介 Scorecardpy库简介 二、目标定义与数据准备 目标定义 数据准备 三、安装scorecardpy包 四、数据检查 五、数据筛选 六、数据划分 七、变量分箱 卡方分箱 手动调整分箱 八、建立模型 相关性分析 多重共线性检验VIF KS和AUC …

李宏毅 Generative Adversarial Network(GAN)生成对抗网络

(延申)GAN Lecture 1 (2018)- Introduction_哔哩哔哩_bilibili Basic Idea of GAN 附课程提到的各式各样的GAN&#xff1a;https://github.com/hindupuravinash/the-gan-zoo 想要让机器做到的是生成东西。->训练出来一个generator。 假设要做图像生成&#xff0c;要做的是…

【Qt之模型视图】5. Qt库提供的视图便捷类

1. 前言 Qt提供了一些便捷的视图类&#xff0c;如QListWidget提供项目列表&#xff0c;QTreeWidget显示多级树结构&#xff0c;QTableWidget提供单元格项的表格。每个类都继承了QAbstractItemView类的行为&#xff0c;QAbstractItemView类实现了项目选择和标题管理的通用行为。…

16.5 参考文献——深度学习定位

16.5 一种高效鲁棒的多楼层室内环境指纹定位方法 同济大学 Zhao Y, Gong W, Li L, et al. An Efficient and Robust Fingerprint Based Localization Method for Multi Floor Indoor Environment[J]. IEEEa Internet of Things Journal, 2023. 2.相关工作 B.基于深度学习的…

固态硬盘优化设置

目录 前言&#xff1a; 关闭Windows Search 禁用系统保护&#xff08;不建议&#xff09; 不建议禁用系统保护原因 关闭碎片整理【机械硬盘】 提升固态硬盘速度 开启TRIM 合理使用固态硬盘的容量 正确关机 关闭开机自启 前言&#xff1a; 电脑配备固态硬盘就能一劳…

自我摸索:如何运营并玩转CSDN?

自注册CSDN以来已有七年之久&#xff0c;但真正运营CSDN也是最近一年的事情&#xff0c;大概就是22年底&#xff0c;参加2022 博客之星 的竞选。接触了很多大佬&#xff0c;也学习模仿着开始玩转CSDN&#xff0c;虽然没有同期运营的大佬们玩的6&#xff0c;但也有一些经验可以来…

Arduino 智能学习简易版 机械臂

文章目录 一 总体思路1 功能原理2 硬件准备3 Arduino库 二 代码设计1 舵机部分2 电位器3 记录路径法4 触控板与三色灯板 三 展示效果视频链接 一 总体思路 1 功能原理 实现功能&#xff1a;使用电位器控制每一个舵机运动&#xff0c;进而操作机械臂&#xff1b;设置学习模式&…