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

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.初始化:创建一个空栈,用于存储左括号。&#xff08;LC这题不用&#xff0c;自己写完整的需要&#xff09; 2.遍历字符串:从左到右依次扫描字符串中的每个字符。 3.处理左括号:如果是左括号,将其压入栈中。 4.处理右…...

基于springboot企业微信SCRM管理系统源码带本地搭建教程

系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统与功能介绍 基…...

【MTMSA】不确定缺失模态下基于情态翻译的多模态情感分析

MTMSA是基于TATE改进的&#xff0c;大致框架都和他一样&#xff0c;区别在于MTMSA没有提到tag&#xff0c;并且在多头注意力的部分进行了改进&#xff0c;也就是文中模态翻译模块&#xff0c;此外还加了两个损失函数。在TATE中有一章是不同设置的影响&#xff0c;里面有多个证明…...

【php常用公共函数】php获取指定时间段中有那几年并输出年份的起始时间和结束时间

php获取指定时间段中有那几年并输出年份的起始时间和结束时间 实现思路实现代码输出结果 实现思路 解析输入的时间&#xff1a;将输入的时间字符串转换为DateTime对象。计算年份范围&#xff1a;从开始年份到结束年份&#xff0c;生成一个包含所有年份的数组。输出年份的起始和…...

CTF-PWN: 什么是_IO_FILE?

重要概念:fopen()返回的是一个结构体的指针 _IO_FILE 结构体在什么时候被创建&#xff1f; _IO_FILE 结构体的实例是在程序使用标准 I/O 函数&#xff08;如 fopen、fclose、fread、fwrite 等&#xff09;时创建和管理的。这个结构体实际上是 GNU C Library (glibc) 用于处理…...

前端八股文第二篇

11.事件循环 事件循环&#xff08;Event Loop&#xff09;是 JavaScript 运行时中的一种机制&#xff0c;用于处理异步操作和事件驱动的编程。在浏览器环境中&#xff0c;事件循环是指浏览器通过事件队列&#xff08;Event Queue&#xff09;来管理和调度异步任务的执行顺序。…...

springboot汽车保修服务管理系统-计算机毕业设计源码00052

摘 要 随着汽车数量的不断增加和汽车保修服务需求的日益增长&#xff0c;建立一套高效的汽车保修服务管理系统变得至关重要。基于Spring Boot框架的汽车保修服务管理系统旨在整合汽车保修流程&#xff0c;简化管理流程&#xff0c;提高服务质量和用户体验未来&#xff0c;我们将…...

分布式架构搭建博客网站

目录 运行环境基础配置需求准备工作配置静态ip修改主机名及host映射开启防火墙时间同步配置免密ssh登录 环境搭建Server-Web端安装LNMP环境软件Server-NFS-DNS端上传博客软件Server-NFS-DNS端设置NFS共享Server-Web设置挂载远程共享目录nginx设置在数据库中创建数据库和用户重启…...

python-opencv给图片或视频去水印

文章目录 引言inpaint函数的使用方法鼠标事件回调函数cv2.setMouseCallback介绍去水印步骤实现代码 引言 本文主要基于cv2.inpaint函数实现图片的水印去除。 inpaint函数基于图像修复算法&#xff0c;通过对缺陷区域周围像素的分析和插值&#xff0c;生成合适的像素值来填充缺…...

免费送源码:Java+ssm+Springboot Springboot手办定制销售系统 计算机毕业设计原创定制

Springboot手办定制销售系统 摘 要 随着人们生活水平的提高和互联网的发展&#xff0c;人们消费思想和消费方式的逐渐改变&#xff0c;使得消费者开始追求自身品味和个性。手办定制就是在这种条件下应运而生。手办定制是基于客户需求来定制产品&#xff0c;满足客户对其功能、结…...

卡夫卡的使用

关于消息队列的使用 一、消息队列概述 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveM…...

mac|maven项目在idea中连接redis

安装maven brew install maven idea-setting导入redis插件 idea新建maven项目 构建系统选择maven 项目右侧数据库图标导入redis 新建一个数据库&#xff0c;名称必须为数字&#xff0c;测试一下是否可以连接&#xff0c;连接成功后选择确定 pom.xml导入redis <depende…...

Python基础学习------第一天

print("hello world") 1.括号和引号&#xff0c;必须使用的是英文 被双引号包围起来的称为字符串。 python注释&#xff1a;单行注释&#xff1a;1.井号# 2.多行注释 &#xff1a;""" """ print输出多个内容是中间用逗号隔开就好…...

MySQL的SQL语句之触发器和存储过程的应用

触发器 Trigger 一.触发器 作用&#xff1a;当检测到某种数据表发生数据变化时&#xff0c;自动执行操作&#xff0c;保证数据的完整性。 1.创建一个触发器 如上图所示&#xff0c;查看这个create的帮助信息的时候&#xff0c;这个create trigger就是创建触发器的意思。 如…...

【MD5】密码加密之加盐算法

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 本期主要是给大家分析一下, 密码的如果加密存储的, 学习加盐算法的思想, 通过一个简单的案例, 即可快速学习. 一起来看看叭~ 适用于编程初学者&#xff0c;感兴趣的朋友们可以订阅&…...

服务器虚拟化

前言 服务器虚拟化是一种技术&#xff0c;它通过将一台物理服务器的软件环境分割成多个独立分区&#xff0c;使每个分区都能模拟出一台完整的虚拟服务器。这种技术利用虚拟化技术充分发挥服务器的硬件性能&#xff0c;提高运营效率&#xff0c;节约能源并降低经济成本。 通过…...

贪心算法理论基础和习题【算法学习day.17】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…...

爬虫ip技术未来发展趋势

各位朋友&#xff0c;大家好&#xff01;有伙伴问爬虫技术未来会有更好的发展么&#xff0c;那今天小蝌蚪来跟大家聊聊爬虫技术未来的发展趋势分享一下行业咨询。 大家在日常工作和生活中&#xff0c;都希望事情能更省心、高效吧&#xff1f;未来的爬虫技术就朝着这个方向发展…...

推荐一款功能强大的文字处理工具:Atlantis Word Processor

Atlantis word proCEssor是一款功能强大的文字处理工具。该软件可以让用户放心的去设计文档&#xff0c;并且软件的界面能够按用户的意愿去自定义&#xff0c;比如工具栏、字体选择、排版、打印栏等等&#xff0c;当然还有更多的功能&#xff0c;比如你还可以吧软件界面中的任何…...

语言≠思维,大模型学不了推理:一篇Nature让AI社区炸锅了

转自&#xff1a;机器之心 大语言模型&#xff08;LLM&#xff09;为什么空间智能不足&#xff0c;GPT-4 为什么用语言以外的数据训练&#xff0c;就能变得更聪明&#xff1f;现在这些问题有 「标准答案」了。 近日&#xff0c;一篇麻省理工学院&#xff08;MIT&#xff09;等…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...