第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用

news2024/10/6 10:42:19
  • 博客主页:誓则盟约
  • 系列专栏:IT竞赛 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

试题F:括号与字母

【问题描述】

         给定一个仅包含小写字母和括号的字符串 S ,保证括号可以两两匹配。 给出 Q 组询问,每组询问给出一个小写字母 ci 和一个数 xi ,询问 S 中有 多少对匹配的括号之间有不少于 xi 个 ci 。

【输入格式】

        输入的第一行包含一个字符串 S 。 第二行包含一个整数 Q 。 接下来 Q 行,每行包含一个小写字母 ci 和一个整数 xi 表示一组询问,用 一个空格分隔。

【输出格式】

         输出 Q 行,每行包含一个整数,依次表示每个询问的答案。

【样例输入】

((a)()((b)((c))))

3

a 2

b 1

c 1

【样例输出】

0

3

4

【评测用例规模与约定】

        对于 40% 的评测用例,|S |, Q ≤ 5000 ; 对于 70% 的评测用例,|S | ≤ 100000 ; 对于所有评测用例,1 ≤ |S | ≤ 106 ,1 ≤ Q ≤ 100000 ,0 ≤ xi < 106 。其中 |S | 表示 S 的长度。


分析问题:

        仔细读题,保证给的s中括号都两两匹配,那么这道题就相当于是在考察入栈和出栈的问题了,这里我们需要定义一个符号栈和一个字母栈。

  • 符号栈:专门用来存储左括号,遇见左括号则入栈,遇见右括号则栈顶的左括号出栈。并且对加入的左括号所包含的字母个数做标记,记录出栈前的左括号和右括号之间有几个字母,最后可以通过字符串切割来找到这个括号内的字母。
  • 字母栈:遇见字母则入栈,不需要出栈。用于储存字母。


 

代码实现:

s=str(input()) # 输入s
s0="abcdefghijklmnopqrstuvwxyz" # 一会判断字母要用
q=int(input())  # 输入询问次数q
for i in range(q): # q次循环,每次询问都有一个输出值
    s1,b1=map(str,input().split())  # 输入要询问的字母和被包括的个数
    b=int(b1)  # 转次数为int型
    v=s.count(s1) 
    if v<b:print(0)  # 此时总个数都小于要询问的个数b,一定没有符合题意的 返回0
    else:
        re=0 # 记录个数
        stick_1=[] # 符号栈
        stick_2=[] # 字母栈
        for j in s: # 遍历s
            if j=="(":  #遇见左括号则入栈
                stick_1.append([j,0]) # 后面的0 用于标记这个左括号与对应的右括号之间有几个字母
            elif j in s0:  # 如果是字母,则入字母栈
                stick_2.append(j)
                for w in range(len(stick_1)): 
                    stick_1[w][-1]+=1 # 对于所有的左括号对应的标记值,都加1,说明他们与对应的右括号之间多了一个字母
            else: # 否则则是右括号
                k_1,st=stick_1.pop() # 遇见右括号,则从符号栈出栈一个左括号
                if st==0: continue # 说明左括号右括号之间没有元素,直接跳
                ve=stick_2[-1:-st-1:-1] # 否则说明之间有元素,则找到这些元素
                if ve.count(s1)>=b:# 判断ve中要查询的字母个数是否合题意
                    re+=1 # 标记的个数+1
        print(re) # 对于每次询问都返回 res

 

总结:

以下是对这段代码的详细解释:

  • s = str(input()):获取用户输入的字符串 s
  • s0 = "abcdefghijklmnopqrstuvwxyz":定义了所有小写字母的字符串,用于后续判断字母。
  • q = int(input()):获取询问的次数。
  • 然后进入 q 次循环:
    • s1, b1 = map(str, input().split()):分别获取要询问的字母和期望的包含个数,将 b1 转换为整数类型。
    • v = s.count(s1):计算字符串 s 中该字母出现的总次数。如果总次数小于期望个数,直接输出 0
    • 否则,进行复杂的处理:
      • re = 0 用于记录符合条件的个数。
      • stick_1 是符号栈,stick_2 是字母栈。
      • 遍历字符串 s
        • 遇到左括号,将其及初始标记值 0 入栈。
        • 遇到字母,入字母栈,并更新符号栈中每个左括号对应的标记值,表示它们之间多了一个字母。
        • 遇到右括号,弹出符号栈中的一个左括号和标记值。如果标记值为 0,则直接跳过;否则,找到左括号和右括号之间的元素,判断其中要查询的字母个数是否满足条件,如果满足则增加标记个数 re
      • 最后输出每次询问对应的 re

        总的来说,这段代码主要是通过栈的操作来处理字符串中括号内的子串,并判断其中特定字母的出现次数是否满足要求。

对于这道题的考点和反思如下:

考查内容

  1. 对字符串的处理和操作能力,包括字符的统计、遍历等。
  2. 栈这种数据结构的运用,通过栈来处理括号内的内容和计数。
  3. 逻辑思维和问题分析解决能力,需要仔细思考如何在复杂的条件下准确判断符合要求的情况。

 

学会的内容

  1. 更加深入地掌握了字符串处理的技巧和方法。
  2. 熟悉了栈的实际应用场景,以及如何通过栈来解决特定问题。
  3. 提升了面对复杂逻辑问题时设计算法和代码实现的能力。

反思

  1. 在处理复杂逻辑时,要更加仔细地设计算法和流程,避免遗漏特殊情况。
  2. 对于数据结构的运用要更加灵活,根据具体问题选择合适的数据结构来优化解决方案。
  3. 编写代码时要注意代码的可读性和可维护性,以便后续的理解和修改。同时要充分考虑代码的效率和性能。

        总之,这道题放在15分的位置,并不算是难题,主要还是考察对栈的应用熟练程度是否到位。 相关栈的篇章:栈的理解与应用

“甲之蜜糖,乙之砒霜。” ——《曼陀罗》

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

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

相关文章

少有人走的低风险创业之路:一人公司

大家好&#xff0c;我是弗雷&#xff01;在前面的文章中&#xff0c;深入讨论了老板和员工思维的本质不同&#xff0c;非常值得普通人一看。接下来&#xff0c;我们将继续分享一人公司的话题。 一提到创业就认为风险很大&#xff1f; 只懂埋头苦干&#xff0c;不懂创新营销怎…

rocketmq-5.1.2的dleger高可用集群部署

1、背景 原先为5.0.0版本&#xff0c;因检查出有漏洞&#xff0c;升级到5.1.2版本。 【Rocketmq是阿里巴巴在2012年开发的分布式消息中间件&#xff0c;专为万亿级超大规模的消息处理而设计&#xff0c;具有高吞吐量、低延迟、海量堆积、顺序收发等特点。在一定条件下&#xf…

如何手动实现multiSetIfAbsent、multiExpire

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,目前工作于上海某电商服务公司…”); 📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”); 🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三…

C#操作MySQL从入门到精通(22)——创建表与操纵表

前言 我们新建数据库以后,最需要做的就是创建表,对数据库的操作绝大多数情况下都是都对表的操作,本文就是讲解如何创建表以及修改表中的列,修改表名等操作。由于创建表的方法基本上有两种,一种是使用带有界面的工具比如Navicate来创建表,另一种是使用sql语句来创建表,实…

rv1126-rv1109-串口显示路径不变化

串口只有#, 后来看了教程改成如下 但是没有变化,那个路径都只显示rootLonbon# 于是最后改成了这样 因为:

CSS函数: 实现数据限阈的数字函数

CSS函数中提供了几个比较实用的数字函数&#xff0c;它可以帮助我们实现一定的数学计算功能。常见的数字函数目前提供了五个&#xff1a;calc()、max()、min()和clamp()函数。其基本实现功能如下&#xff1a; calc()&#xff1a;允许在声明 CSS 属性值时执行一些计算。max()&a…

数据结构 —— 堆

1.堆的概念及结构 堆是一种特殊的树形数据结构&#xff0c;称为“二叉堆”&#xff08;binary heap&#xff09; 看它的名字也可以看出堆与二叉树有关系&#xff1a;其实堆就是一种特殊的二叉树 堆的性质&#xff1a; 堆中某个结点的值总是不大于或不小于其父结点的值&…

ColorEasyDuino上手指南

介绍 ColorEasyDuino是嘉立创推出的一块Aduino开发板&#xff08;类似物&#xff09;&#xff0c;具有丰富的外设接口&#xff1a;uart、i2c、spi、adc、pwm等&#xff1b;开发板设计参考原型是Arduino Uno&#xff0c;采用的芯片是ATMEGA328P&#xff0c;它的外观设计比较紧凑…

⌈ 传知代码 ⌋ MonoCon解读与复现

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

【Gradio】快速入门

https://www.gradio.app/ Gradio 是一个开源 Python 软件包https://github.com/gradio-app/gradio &#xff0c;可以让你快速为机器学习模型、API 或任何任意 Python 函数创建一个演示或网络应用程序。然后&#xff0c;您就可以使用 Gradio 内置的分享功能&#xff0c;在几秒钟…

ROS2底层机制源码分析

init ->init_and_remove_ros_arguments ->init ->Context::init 保存初始化传入的信号 ->install_signal_handlers→SignalHandler::install 开线程响应信号 ->_remove_ros_arguments 移除ros参数 ->SingleNodeManager::instance().…

D-Bus——system 调用session 报错

以下代码是一个 session 服务和 systemd 服务 demo &#xff1a; systemd DBus #include <QCoreApplication> #include <QDBusConnection> #include <QDBusInterface> #include <QDBusError> #include <QDebug>class TestObject : public QObje…

一文搞懂flex布局

上学读书的时候&#xff0c;学习flex布局&#xff0c;更多停留在理论知识层面。近来&#xff0c;经过工作实践&#xff0c;发现自己对flex布局的理解更加深入&#xff0c;运用起来更加熟练&#xff0c;也越发能感受到flex布局的强大灵活性&#xff0c;特来总结一波。若有错误之…

Android Glide loading Bitmap from RESOURCE_DISK_CACHE slow,cost time≈2 seconds+

Android Glide loading Bitmap from RESOURCE_DISK_CACHE slow,cost time≈2 seconds 加载一张宽高约100px多些的小图&#xff0c;是一张相当小的正常图片&#xff0c;loading Bitmap from RESOURCE_DISK_CACHE竟然耗时达到惊人的3秒左右&#xff01;&#xff08;打开Glide调试…

元宇宙数字化3D虚拟展馆

随着科技的飞速发展&#xff0c;我们迎来了一个全新的时代——元宇宙时代。在这个充满无限可能的虚拟世界中&#xff0c;元宇宙数字展馆搭建编辑器应运而生&#xff0c;以其卓越的技术和创新的理念&#xff0c;为用户带来了前所未有的沉浸式展览体验。 元宇宙数字展馆搭建编辑器…

普涨和补涨—2024年上半年全球投资趋势

全球大宗商品价格处在上涨周期&#xff0c;东吴证券认为上游能源行业股价还有继续上涨的空间。随着6月全球股指进一步上涨&#xff0c;预计港股可能还会迎来补涨行情。 一、我们观察的全球投资趋势&#xff1a; 1、全球股指普涨&补涨。全球风险资产进入2024年后普遍上涨&am…

Spark安装、解压、配置环境变量、WordCount

Spark 小白的spark学习笔记 2024/5/30 10:14 文章目录 Spark安装解压改名配置spark-env.sh重命名&#xff0c;配置slaves启动查看配置环境变量 工作流程maven创建maven项目配置maven更改pom.xml WordCount按照用户求消费额上传到spark集群上运行 安装 上传&#xff0c;直接拖拽…

一文讲清:生产报工系统的功能、报价以及如何选择

最近这几年&#xff0c;企业越来越注重生产的速度和成本&#xff0c;尤其是“性价比”&#xff0c;生产报工系统已经变成了制造业里不可或缺的一部分。不过&#xff0c;市场上生产报工系统的选择太多&#xff0c;价格也都不一样&#xff0c;这就给很多企业出了个难题&#xff1…

【Python数据魔术】:揭秘类型奥秘,赋能代码创造

文章目录 &#x1f680;一.运算符&#x1f308;1. 算术运算符&#x1f308;2. 身份运算符&#x1f308;3. 成员运算符⭐4. 增量运算符⭐5. 比较运算符⭐6. 逻辑运算符 &#x1f680;二.可变与不可变&#x1f680;三.字符串转义&#x1f680;四.编码与解码&#x1f4a5;1. 基础使…

SpringBoot 异常配置

系统异常处理 创建异常处理器类&#xff0c;类上添加ControllerAdvice注解。 package com.soft.exception;import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframewor…