有效的括号 + 点击消除 || 匹配问题

news2024/10/6 8:28:00

目录

点击消除: 

有效的括号: 


点击消除: 

点击消除_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/8d3643ec29654cf8908b5cf3a0479fd5?tpId=308&tqId=40462&ru=/exam/oj

如题目所述,

示例1:" abbc ",消除了相同且相邻的字母 b 后,剩下 " ac ", a 和 c 不是相邻的字母,最终结果为 " ac "

示例2:" abba ",消除了相同且相邻的字母 b 后,剩下 " aa ",消除 b 前不相邻的字母 a ,在消除后变相邻了,此时消除字母 a ,按照题目要求,最终输出结果为 0

我们可以借助栈后进先出的原理来解决这个问题:

假设 s 是输入的字符串,s[ i ] 是当前我们访问的字母,我们用字符串 result 来模仿栈,

1、当 result 为空,先把字母添加到 result 中,如图,此时把 a 添加到 result 中

2、当 result 不为空时,判断 result 的最后一个字符(相当于栈顶元素) 和 s[ i ] 是否为相等的字母,

a. 如果不相等,把字母 s[ i ] 添加到 result 中(相当于进栈),如图,假设 result 的栈顶元素为 a,s[ i ] 为 b,它们不相等,所以 b 进栈

b. 如果相等,说明栈顶元素和 s[ i ] 是相邻且相等的字母,栈顶元素和 s[ i ] 是要消除的字母,此时删除栈顶元素,完成了一次消除。如图,假设 result 的栈顶元素为 b,s[ i ] 为 b,它们相等且相邻,所以删除栈顶元素 b ,此时的栈顶元素变为 a。

根据上面的原理,再次来理解示例2:

i 从 0 开始:

s[ 0 ]:一开始栈为空,所以 a 进栈

s[ 1 ]:当访问字母 b 时,b 和栈顶元素 a 不相等,所以 b 进栈

s[ 2 ]:当访问字母 b 时,b 和栈顶元素 b 相等,所以 b 出栈

s[ 3 ]:当访问字母 a 时,a 和栈顶元素 a 相等,所以 a 出栈,此时 result 为空字符

用栈的思想就可以解决一开始相等但不相邻的字母,再经过消除后,变成相等且相邻的字母的消除问题。

#include <iostream>
using namespace std;
#include<string>
int main() {
   string enter;//接收输入的字符串
   cin>>enter;//输入
   string result;//最终结果的字符串,模拟栈
   for(int i=0;i<enter.size();i++)//遍历输入的字符串
   {
        //字符串不为空,且字符串的最后一个字符(即栈顶元素)和enter[i]字符相等
        if(result.size() && enter[i] == result.back())
        {
            result.pop_back();//消除字符串的最后一个字符,相当于出栈
        }
        else {
            //相当于进栈 
            result+=enter[i];
        }
   }
   if(result.size())
   {
        cout<<result<<endl;//字符串不为空
   }
   else {
        cout<<0<<endl;//字符串为空
   }
   return 0;
}

 

有效的括号: 

20. 有效的括号 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/valid-parentheses/submissions/525036077/

有效括号的匹配问题,需要处理三种匹配:

1、数量匹配,如果 s 中的括号个数为奇数个,则一定不匹配,直接利用库函数求出字符串的长度,长度为奇数,直接返回 false,如果 s 中的括号个数为偶数个,当左右括号的数量不匹配,返回 false

2、类型匹配() 匹配,{} 匹配,[] 匹配,否则都是属于不匹配

3、顺序匹配,必须先出现左括号,再出现右括号,比如 ) (,虽然都是小括号,但是先出现的是右括号,故不匹配

除此之外,类似上一题的点击消除,比如字符串为 " ( { [ ] } ) ”,消除了 [ ] 之后,字符串为 " ( { } ) ”,{ } 匹配,再次消除,字符串剩下 " (  ) ”, (  )匹配,所以整个字符串的括号都是匹配的

我们同样可以用栈的思想来解决问题:

1、如果访问的字符是左括号,则进栈

2、如果访问的字符是右括号

a. 如果栈为空,说明栈里面没有左括号,此时顺序不匹配,返回 false

b.如果栈不为空,则需要判断栈顶元素(左括号)和右括号是否匹配,如果左右括号匹配,则需要删除栈顶元素(因为这个栈顶元素的左括号已经有和它匹配的右括号了,不需要继续判断了),如果左右括号不匹配,直接返回 false

3、把所有的括号都判断完之后,并不意味着可以返回 true 了,如果栈不为空,说明左右括号的数量不匹配,返回 false,如果栈为空,说明所有的括号都匹配了,返回 true

class Solution {
public:
    bool isValid(string s) {
        stack<char> match;//存左括号
        if(s.size()%2!=0)
            return false;//单数个括号,数量不匹配
        for(int i=0;i<s.size();i++)
        {
            //左括号,进栈
            if(s[i]=='('||s[i]=='['||s[i]=='{')
            {
                match.push(s[i]);
            }   
            else
            {
                //右括号,且栈不为空,和栈顶元素匹配
                //不匹配,或者栈为空,false
                if(match.empty())
                    return false;
                if((s[i]==')' && match.top()!='(')
                || (s[i]==']' && match.top()!='[')
                || (s[i]=='}' && match.top()!='{'))
                    return false;
                
                match.pop();//匹配,删除栈顶元素
            } 
            
        }
       //s遍历完,且栈为空,true
       //栈不为空,false
       if(match.empty())
            return true;
        else
            return false;
    }
};

 

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

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

相关文章

顺丰同城急送API对接(附源码)

一、背景 最近公司让我对接顺丰同城急送的API&#xff0c;讲讲里面需要注意的几点 官方的API文档有些示例代码也不全&#xff0c;具体细节不多说&#xff0c;如果你现在也需要对接他们API&#xff0c;可以参考本篇博客再配合官方文档结合起来看&#xff0c;可以让您再开发的时…

C++面向对象程序设计-北京大学-郭炜【课程笔记(七)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;七&#xff09;】 1、类型转换运算符2、自增、自减运算符的重载3、继承和派生的基本概念3.1、基本概念3.2、派生类对象的内存空间 4、继承关系和复合关系4.1、继承关系的使用4.2、复合关系的使用 5、派生类覆盖基类成员6…

【分治】Leetcode 数组中的第K个最大元素

题目讲解 数组中的第K个最大元素 算法讲解 堆排序&#xff1a;1. 寻找最后一个节点的父亲&#xff0c;依次向上遍历&#xff0c;完成小堆的建立&#xff1b;2. 从最后一个元素开始&#xff0c;和堆顶的数据做交换&#xff0c;此时最小的数据在对后面&#xff0c;然后对剩下的…

C++设计模式|创建型 4.建造者模式

1.什么是建造者模式? 建造者模式&#xff08;也被成为生成器模式&#xff09;&#xff0c;是一种创建型设计模式&#xff0c;软件开发过程中有的时候需要创建很复杂的对象&#xff0c;而建造者模式的主要思想是将对象的构建过程分为多个步骤&#xff0c;并为每个步骤定义一个…

OpenHarmony图形处理库—pyclipper [GN编译]

简介 pyclipper是图形处理库&#xff0c;用于剪裁和偏移直线和多边形。 下载安装 直接在OpenHarmony-SIG仓中搜索pyclipper并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的pyclipper库代码存在以下路径&#xff1a;./third_party/pyclipper 修改添加依…

Java 算法篇-深入了解 BF 与 KMP 算法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 BF 算法概述 1.1 BF 算法实际使用 2.0 KMP 算法概述 2.1 KMP 算法实际使用 2.2 相比于 BF 算法实现&#xff0c;KMP 算法的重要思想 2.3 为什么要这样设计&#x…

ATFX汇市:日元贬值导致进口物价走高,日央行或有二次加息计划

消息面&数据面&#xff1a; 日本央行行长植田和男表示&#xff0c;弱势日元可能影响通胀趋势&#xff0c;如果这样可能导致政策转变。意思是说&#xff0c;随着日元汇率逼近160.00&#xff0c;日元贬值对进口物价的影响越来越明显。如果日元继续保持贬值态势&#xff0c;日…

【Java】文件大小转换工具类(B,KB,MB,G,TB,PB)

说明 使用方法&#xff1a;FileMemoryUtil.prettyByteSize(35871)&#xff0c;参数为字节个数 返回结果&#xff1a;保留一位小数的自适应结果&#xff08;例如&#xff1a;4.1KB&#xff09;。可以留意在浏览器上下载的文件&#xff0c;会根据文件大小展示不同的单位&#xff…

腾讯面试准备-2024.3.25

腾讯面试准备-2024.3.25 腾讯面试准备-2024.3.25自我介绍C11/14/17新特性C11新特性C14新特性C17新特性 struct和class的区别进程状态现代的流媒体通信协议栈流媒体协议详解extern "C"程序从编译到执行的过程进程、线程、协程进程线程协程 如何实现一个信号与槽系统&a…

【强化学习的数学原理-赵世钰】课程笔记(十)Actor-Critic 方法

目录 一.最简单的 actor-critic&#xff08;QAC&#xff09;&#xff1a;The simplest actor-critic (QAC) 二.Advantage actor-critic (A2C) 三.Off-policy actor-critic 方法 四. Deterministic actor critic(DPG) Actor-Critic 方法把基于 value 的方法&#xff0c;特别…

maven3.9的settings.xml 内容学习

settings.xml 文件介绍 settings.xml 是 Maven 的配置文件&#xff0c;它允许你自定义 Maven 的行为&#xff0c;比如设置仓库、代理、认证信息等。在 Maven 3.9 中&#xff0c;settings.xml 的结构和内容可能与之前的版本相似&#xff0c;但可能会有一些小的改进或变化。下面…

【码农教程】手把手教你Mockito的使用

一、前期准备&#xff5e; 1、准备工作 <!--mockito依赖--> <dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>2.7.19</version><scope>test</scope> </dependenc…

NASM中的-f选项

2024年4月19日&#xff0c;周五下午 -f选项 在 NASM 中&#xff0c;-f 选项用于指定输出格式或目标文件格式。这个选项允许你告诉 NASM 将汇编代码编译成特定格式的目标文件&#xff0c;以便与特定的操作系统或环境兼容。下面是 -f 选项的一些常见用法和参数&#xff1a; -f …

excel表格怎么设置密码?excel文件加密的两个方法

一、加密码的原理​ Excel加密码的原理主要基于加密算法和密钥管理。当用户为Excel文件或工作表设置密码时&#xff0c;Excel会采用一种加密算法对文件或工作表进行加密处理。这种加密算法通常是对称加密算法&#xff0c;如AES(高级加密标准)或DES(数据加密标准)。 二&#x…

iframe和 blob实现JS,CSS,HTML直接当前页预览

先贴效果图&#xff1a; <template><div><div class"aaa"></div><div class"btn-run" click"tres">运行</div></div></template><script>import { mapState } from vuex;export default …

C++之类和对象三

目录 拷贝构造函数 定义铺垫 浅拷贝 深拷贝 总结 拷贝构造函数 那在创建对象时&#xff0c;可否创建一个与一个对象一某一样的新对象呢&#xff1f; 定义铺垫 构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c…

软考-系统集成项目管理中级--项目质量管理(输入输出很重要!!!本章占分较高,着重复习)

本章历年考题分值统计 本章重点常考知识点汇总清单 5、成本效益分析法:对每个质量活动进行成本效益分析&#xff0c;就是要比较其可能的成本与预期的效益。达到质量要求的主要效益包括减少返工、提高生产率、降低成本、提升干系人满意度及提升赢利能力。(掌握)17下64考题 本章…

IDEA配置Maven环境

黑马程序员JavaWeb开发教程 文章目录 如果当前有已经打开项目的话&#xff0c;File -> Close Project 到以下页面之后选择 Customize -> All settings… 配置maven的安装目录&#xff0c;maven的配置文件&#xff0c;maven的本地仓库&#xff08;修改完成之后一定要先…

DRF 序列化类保存save源码

【七】序列化保存save源码 【1】介绍 无论是创建还是修改数据&#xff0c;都需要执行save方法&#xff0c;再前面的使用中都没有再里面添加过参数 其实save中可以给额外参数比如.save(timedatetime.datetime.now())这个需要模型表中有time的字段&#xff0c;结果就是将当前时…

【YOLOv5】利用Kaggle的GPU训练(运行)yolov5模型(项目)

文章目录 &#xff08;一&#xff09;下载YOLOv5源码&#xff08;二&#xff09;修改YOLOv5源码1、修改输出文件的保存路径&#xff08;适应Kaggle的输出路径&#xff09;2、在data文件夹中新建一个yaml文件3、在 train.py 中修改data路径4、指定训练的轮数5、修改模型配置文件…