LC20. 有效的括号
用来熟悉一下栈的应用之括号匹配
题目链接
下面是大致思路
1.初始化:创建一个空栈,用于存储左括号。(LC这题不用,自己写完整的需要)
2.遍历字符串:从左到右依次扫描字符串中的每个字符。
3.处理左括号:如果是左括号,将其压入栈中。
4.处理右括号:如果是右括号,检查找顶元素是否与其匹配:
- 如果匹配,弹出栈顶元素。
- 如果不匹配,返回false,表示括号不匹配。
5.检查栈是否为空:
- 遍历结束后,检查找是否为空。
- 如果栈为空,表示所有括号匹配;否则,返回false。
(还有就是一开始可以直接排除掉奇数个的情况,不可能匹配
可运行版
下面就是注意一个地方
pairs函数,在扫描的时候如果发现是左括号,那么会进入后面的else逻辑,让左括号入栈
如果发现是右括号
那么会返回与之匹配的左括号,去和当前栈顶的左括号匹配
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>// 定义一个函数 pairs,用于返回与右括号对应的左括号
char pairs(char a)
{if (a == '}')return '{';if (a == ']')return '[';if (a == ')')return '(';return 0;
}// 检查括号是否匹配的函数
bool isValid(char *s)
{int n = strlen(s); // 获取字符串的长度if (n % 2 == 1){ // 如果字符串长度是奇数,不可能匹配return false;}int *stk = (int *)malloc((n + 1) * sizeof(int)); // 动态分配栈的大小if (stk == NULL){printf("Memory allocation failed\n");return false;}int top = 0; // 初始化栈顶指针int i; // 将变量声明移到循环外部for (i = 0; i < n; i++){char ch = pairs(s[i]); // 获取与当前字符对应的左括号if (ch){ // 如果当前字符是右括号if (top == 0 || stk[top - 1] != ch){ // 检查栈是否为空或栈顶元素是否匹配free(stk); // 释放动态分配的内存return false;}top--; // 弹出栈顶元素}else{ // 如果当前字符是左括号stk[top++] = s[i]; // 将左括号压入栈中}}bool result = (top == 0); // 如果栈为空,表示所有括号匹配free(stk); // 释放动态分配的内存return result;
}// 示例使用
int main()
{printf("%d\n", isValid("()")); // 输出: 1 (true)printf("%d\n", isValid("()[]{}")); // 输出: 1 (true)printf("%d\n", isValid("(]")); // 输出: 0 (false)printf("%d\n", isValid("([)]")); // 输出: 0 (false)printf("%d\n", isValid("{[]}")); // 输出: 1 (true)// 复杂的例子printf("%d\n", isValid("{[()]}")); // 输出: 1 (true)printf("%d\n", isValid("{[(])}")); // 输出: 0 (false)printf("%d\n", isValid("{{[[(())]]}}")); // 输出: 1 (true)return 0;
}
cpp
#include <iostream>
#include <stack>
#include <string>
using namespace std;
class Solution
{
public:bool isMatch(char a, char b){if ((a == '(' && b == ')') || (a == '[' && b == ']') || (a == '{' && b == '}')){return true;}return false;}bool isValid(string s){stack<char> stk; // 定义一个栈,用来存放左括号// stack是一个容器适配器,它提供了一种先进后出的数据结构,即栈。只能在栈顶进行插入和删除操作。if (s.size() % 2 == 1)return false; // 如果字符串长度为奇数则不可能有效,直接返回false;for (int i = 0; i < s.size(); i++){ // 扫描字符串,遇到左括号入栈,遇到右括号则与栈顶元素匹配;if (s[i] == '(' || s[i] == '[' || s[i] == '{')stk.push(s[i]); // 遇到左括号入栈;// 下面的两个else if 和 else都是对右括号情况的处理else if (stk.empty())return false; // 如果遇到了右括号但是栈已经空了,说明不是有效的括号,直接返回false;else if (!isMatch(stk.top(), s[i]))return false; // 如果遇到右括号且栈不为空,但是栈顶不是相匹配的左括号,返回false;elsestk.pop(); // 当前遍历到的右括号与栈顶左括号相匹配,弹出栈顶元素继续遍历;}return stk.empty(); // 遍历结束后,栈为空则为有效,否则无效;}
};int main()
{Solution s;cout << s.isValid("()") << endl; // 输出: 1 (true)cout << s.isValid("()[]{}") << endl; // 输出: 1 (true)cout << s.isValid("(]") << endl; // 输出: 0 (false)return 0;
}
LC版
C++版
注意 两个empty的不同
比如具体的例子如下
class Solution {
public:bool isMatch(char a,char b){if(a == '(' && b == ')' ||a == '[' && b == ']'||a == '{' && b == '}')return true;elsereturn false;}bool isValid(string s) {int n = s.size();if (n % 2 == 1) {return false;}stack<char> stk;for(int i = 0; i < n ; i++){if(s[i]=='(' || s[i]=='[' || s[i]=='{' )stk.push(s[i]);else if(stk.empty())return false;else if(!isMatch(stk.top(),s[i]))return false;else if(isMatch(stk.top(),s[i]))stk.pop();}return stk.empty(); // 遍历结束后,栈为空则为有效,否则无效;}};
C版
char pairs(char a) {if (a == '}') return '{';if (a == ']') return '[';if (a == ')') return '(';return 0;
}bool isValid(char* s) {int n = strlen(s);if (n % 2 == 1){return false;}int stk[n + 1], top = 0;for (int i = 0; i < n; i++){char ch = pairs(s[i]);if(ch) // 如果是右括号{if ( top == 0 || stk[top - 1] != ch) {// 如果是空栈或者不匹配return false;}top --; // 匹配了就要出栈了(top--指向新的位置)}else //如果是左括号就入栈{//一开始top是0,那么先赋值再移动指针指向下一个位置stk[top] = s[i];top++;}}return top == 0; //最后应该都出栈了
}//总结:其实就是把哪些不成立的条件先列出来,还有注意各种边界条件,然后理解了算法原理,就能写出代码了
相关文章:
LC20. 有效的括号
用来熟悉一下栈的应用之括号匹配 题目链接 下面是大致思路 1.初始化:创建一个空栈,用于存储左括号。(LC这题不用,自己写完整的需要) 2.遍历字符串:从左到右依次扫描字符串中的每个字符。 3.处理左括号:如果是左括号,将其压入栈中。 4.处理右…...
基于springboot企业微信SCRM管理系统源码带本地搭建教程
系统是前后端分离的架构,前端使用Vue2,后端使用SpringBoot2。 技术框架:SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境:jdk8 IntelliJ IDEA maven 宝塔面板 系统与功能介绍 基…...
【MTMSA】不确定缺失模态下基于情态翻译的多模态情感分析
MTMSA是基于TATE改进的,大致框架都和他一样,区别在于MTMSA没有提到tag,并且在多头注意力的部分进行了改进,也就是文中模态翻译模块,此外还加了两个损失函数。在TATE中有一章是不同设置的影响,里面有多个证明…...
【php常用公共函数】php获取指定时间段中有那几年并输出年份的起始时间和结束时间
php获取指定时间段中有那几年并输出年份的起始时间和结束时间 实现思路实现代码输出结果 实现思路 解析输入的时间:将输入的时间字符串转换为DateTime对象。计算年份范围:从开始年份到结束年份,生成一个包含所有年份的数组。输出年份的起始和…...
CTF-PWN: 什么是_IO_FILE?
重要概念:fopen()返回的是一个结构体的指针 _IO_FILE 结构体在什么时候被创建? _IO_FILE 结构体的实例是在程序使用标准 I/O 函数(如 fopen、fclose、fread、fwrite 等)时创建和管理的。这个结构体实际上是 GNU C Library (glibc) 用于处理…...
前端八股文第二篇
11.事件循环 事件循环(Event Loop)是 JavaScript 运行时中的一种机制,用于处理异步操作和事件驱动的编程。在浏览器环境中,事件循环是指浏览器通过事件队列(Event Queue)来管理和调度异步任务的执行顺序。…...
springboot汽车保修服务管理系统-计算机毕业设计源码00052
摘 要 随着汽车数量的不断增加和汽车保修服务需求的日益增长,建立一套高效的汽车保修服务管理系统变得至关重要。基于Spring Boot框架的汽车保修服务管理系统旨在整合汽车保修流程,简化管理流程,提高服务质量和用户体验未来,我们将…...
分布式架构搭建博客网站
目录 运行环境基础配置需求准备工作配置静态ip修改主机名及host映射开启防火墙时间同步配置免密ssh登录 环境搭建Server-Web端安装LNMP环境软件Server-NFS-DNS端上传博客软件Server-NFS-DNS端设置NFS共享Server-Web设置挂载远程共享目录nginx设置在数据库中创建数据库和用户重启…...
python-opencv给图片或视频去水印
文章目录 引言inpaint函数的使用方法鼠标事件回调函数cv2.setMouseCallback介绍去水印步骤实现代码 引言 本文主要基于cv2.inpaint函数实现图片的水印去除。 inpaint函数基于图像修复算法,通过对缺陷区域周围像素的分析和插值,生成合适的像素值来填充缺…...
免费送源码:Java+ssm+Springboot Springboot手办定制销售系统 计算机毕业设计原创定制
Springboot手办定制销售系统 摘 要 随着人们生活水平的提高和互联网的发展,人们消费思想和消费方式的逐渐改变,使得消费者开始追求自身品味和个性。手办定制就是在这种条件下应运而生。手办定制是基于客户需求来定制产品,满足客户对其功能、结…...
卡夫卡的使用
关于消息队列的使用 一、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveM…...
mac|maven项目在idea中连接redis
安装maven brew install maven idea-setting导入redis插件 idea新建maven项目 构建系统选择maven 项目右侧数据库图标导入redis 新建一个数据库,名称必须为数字,测试一下是否可以连接,连接成功后选择确定 pom.xml导入redis <depende…...
Python基础学习------第一天
print("hello world") 1.括号和引号,必须使用的是英文 被双引号包围起来的称为字符串。 python注释:单行注释:1.井号# 2.多行注释 :""" """ print输出多个内容是中间用逗号隔开就好…...
MySQL的SQL语句之触发器和存储过程的应用
触发器 Trigger 一.触发器 作用:当检测到某种数据表发生数据变化时,自动执行操作,保证数据的完整性。 1.创建一个触发器 如上图所示,查看这个create的帮助信息的时候,这个create trigger就是创建触发器的意思。 如…...
【MD5】密码加密之加盐算法
哈喽,哈喽,大家好~ 我是你们的老朋友:保护小周ღ 本期主要是给大家分析一下, 密码的如果加密存储的, 学习加盐算法的思想, 通过一个简单的案例, 即可快速学习. 一起来看看叭~ 适用于编程初学者,感兴趣的朋友们可以订阅&…...
服务器虚拟化
前言 服务器虚拟化是一种技术,它通过将一台物理服务器的软件环境分割成多个独立分区,使每个分区都能模拟出一台完整的虚拟服务器。这种技术利用虚拟化技术充分发挥服务器的硬件性能,提高运营效率,节约能源并降低经济成本。 通过…...
贪心算法理论基础和习题【算法学习day.17】
前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…...
爬虫ip技术未来发展趋势
各位朋友,大家好!有伙伴问爬虫技术未来会有更好的发展么,那今天小蝌蚪来跟大家聊聊爬虫技术未来的发展趋势分享一下行业咨询。 大家在日常工作和生活中,都希望事情能更省心、高效吧?未来的爬虫技术就朝着这个方向发展…...
推荐一款功能强大的文字处理工具:Atlantis Word Processor
Atlantis word proCEssor是一款功能强大的文字处理工具。该软件可以让用户放心的去设计文档,并且软件的界面能够按用户的意愿去自定义,比如工具栏、字体选择、排版、打印栏等等,当然还有更多的功能,比如你还可以吧软件界面中的任何…...
语言≠思维,大模型学不了推理:一篇Nature让AI社区炸锅了
转自:机器之心 大语言模型(LLM)为什么空间智能不足,GPT-4 为什么用语言以外的数据训练,就能变得更聪明?现在这些问题有 「标准答案」了。 近日,一篇麻省理工学院(MIT)等…...
Ubuntu 安装 npm
1. 升级apt sudo apt-get update 2. 安装nodejs sudo apt install nodejs 3. 安装npm sudo apt-get install npm 4. 查看版本 node -v npm -v 完成安装!...
Go:package
文章目录 标准库概述regexp包锁和sync包自定义包和可见性基本格式导入外部安装包包的初始化 自定义包使用godoc自定义包的目录结构 标准库概述 在之前的部分已经用了很多和标准库有关的内容,比如有fmt,os这种功能 unsafe: 包含了一些打破 Go 语言“类型…...
大数据之微服务注册、发现与熔断方案
大数据微服务注册、发现与熔断方案 介绍实现框架利用Spring Cloud实现微服务注册,发现,熔断实例? 一,介绍 大数据微服务注册、发现与熔断是微服务架构中的关键概念,它们各自在微服务架构中扮演着重要的角色。以下是对这…...
最新出炉!2024年邮件营销平台综合盘点
随着数字化营销的不断发展,邮件营销依然是企业与客户保持联系的重要渠道之一。2024年,邮件营销平台市场竞争激烈,各大平台纷纷推出新功能,以满足企业日益增长的需求。在众多平台中,Zoho Campaigns作为一款成熟的邮件营…...
Qgis 开发初级 《ToolBox》
Qgis 有个ToolBox 的,在Processing->ToolBox 菜单里面,界面如下。 理论上Qgis这里面的工具都是可以用脚本或者C 代码调用的。界面以Vector overlay 为例子简单介绍下使用方式。Vector overlay 的意思是矢量叠置分析,和arcgis软件类似的。点…...
Apache HttpClient 和 OkHttpClient 的使用
概述 Apache HttpClient Apache HttpClient是一个开源的HTTP客户端库,提供了丰富的HTTP通信功能。它支持HTTP/1.1和HTTPS协议,具有连接池管理、重试机制、代理设置等高级特性。HttpClient的API设计虽然相对繁琐,但提供了高度的可配置性和灵…...
文本列的性能优化?深入Oracle全文索引
一.什么是全文索引? 全文索引通过分析和处理文本,将文档中的单词分解为词条(tokens),然后存储词条与其所在文档的映射关系。这使得数据库可以快速定位包含特定关键字的记录,而不必对所有文本逐字匹配。 二…...
GoogleChrome和Edge浏览器闪屏问题
GoogleChrome和Edge浏览器闪屏问题 文章目录 GoogleChrome和Edge浏览器闪屏问题 买了电脑半年, GoogleChrome和edge浏览器出现了一个令人头疼的问题–闪屏, 就是打开这两个浏览器之后, 就会出现电脑屏幕一闪一闪的, 过一会就看不见了, 跟黑夜里的闪电一样, 遇到这种情况我都会直…...
【设计模式系列】迭代器模式(七)
一、什么是迭代器模式 迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供一种方法来顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中,这样…...
Go性能基础
本篇内容是根据2020年2月份#117 Foundations of Go performance音频录制内容的整理与翻译 在这个多部分系列的第一部分中,Ian 和 Johnny 以及 Miriah Peterson 和 Bryan Boreham 一起揭开了 Go 程序性能的第一层重要内容。 过程中为符合中文惯用表达有适当删改, 版…...
网站怎样做百度推广计划/网络营销的特点不包括
CDC::GetDeviceCaps()物理长度与屏幕像素间的转换 作用:读取DC的一些打印区域信息,主要是像素和英寸方面的数据. 声明:GetDeviceCaps(int ) 使用例子://所有像素数int pagecxdc.GetDeviceCaps(HORZRES);int pagecydc.GetDeviceCaps(VERTRES); //即每英寸点数short cxInch dc.G…...
高端定制手机网站/关键路径
考真word2007手机版是提供在线备考服务的应用软件,收录了大量的考试真题可以练习,提醒丰富全面,难度不一,层层递进,还模拟考场,支持自动阅卷、评分,提供手把手教学、答案演示等功能,…...
最火网站排名/百度灰色关键词排名代做
1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则…...
如何做聚合类网站/全面网络推广营销策划
最近,Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,从 4.9 开始,Linux 内核已经用上了该算法。根据以往的传统,Google 总是先在自家的生产环境上线运用后,才会将代码开源,此次也…...
网站整合营销/西安seo排名公司
Description 给定N个点以及每个点的权值,要你处理接下来的M个操作。操作有4种。操作从0到3编号。点从1到N编号。 0:后接两个整数(x&…...
wordpress4.9上传失败/产品软文撰写
前言 ResNet(Residual Neural Network)由微软研究院的Kaiming He、Xiangyu Zhang、Shaoqing Ren、Jian Sun四名华人提出,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,对应的论文《Deep Residual Learning …...