OJ #378 字符串括号匹配2

news2025/1/14 18:41:02

题目描述

​ 给出一个字符串,判断其中的左右括号是否匹配。

​ 注:需同时判断左右圆括号 () ,左右中括号 [],左右大括号 {}

​ 不需要考虑括号之间的优先级的问题,也就是说,小括号包含大括号,也是被允许的。

输入

​ 一行一个字符串,以字符@为结尾。

输出

​ 若匹配,输出 YES,若不匹配,则输出 NO。

样例输入

a(cc[])bbb()@

样例输出

YES

样例输入2

a(cc[)]bbb()@

样例输出2

NO

代码

思路:

  1. 将字符串中的各个括号过滤出来,剔除其他字符。
  2. 字符串比较操作没有数字方便,将对应的括号转换成成对的和相等的数字对,比如1,9 对应字符{ }
  3. 遍历数组把能凑成10的数字对过滤,注意判断数字对的顺序也会影响判断。
  4. 递归如果发现最后数组长度是奇数或者长度为偶数且不再变化说明不符合规则,只有长度为零说明可以按照规则一一配对。
#include <stdio.h>
#include <string.h>

char str[305];

void func(int bracket_str[], int len) {
  int leave[305] = {0};
  int start = 0, right = len, index = 0;
  int res = 0;
  while (start < right) {
    if (start + 1 == right || bracket_str[start] + bracket_str[start + 1] != 10 || bracket_str[start] > bracket_str[start + 1]) {
      leave[index++] = bracket_str[start++];
      res++;
    } else {
      start += 2;
    }
  }

  if (index == 0) {
    printf("YES");
    return;
  } else {
    if (index % 2 != 0) {
      printf("NO");
      return;
    } else {
      if (index == len) {
        printf("NO");
        return ;
      }
      func(leave, index);
    }
  }
}
int main() {
  scanf("%s", str);
  int bracket_str[305] = {0};
  int len = 0;
  for (int i = 0, j = 0; i < strlen(str); i++) {
    switch (str[i]) {
     case '@':
      break;
     case '(':
      bracket_str[j++] = 1;
      len++;
      break;
     case ')':
      bracket_str[j++] = 9;
      len++;
      break;
     case '[':
      bracket_str[j++] = 2;
      len++;
      break;
     case ']':
      bracket_str[j++] = 8;
      len++;
      break;
     case '{':
      bracket_str[j++] = 3;
      len++;
      break;
     case '}':
      bracket_str[j++] = 7;
      len++;
      break;
      default:
      break;
    }
  }

  if (len % 2 != 0 || bracket_str[0] > 3 || bracket_str[len - 1] < 4) {
    printf("NO");
  } else {
    func(bracket_str, len);
  }
  return 0;
}

在这里插入图片描述

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

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

相关文章

NodeJS应届毕业生财务管理系统-计算机毕设 附源码82886

基于VueNodeJS应届毕业生财务管理系统 摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。由于现在…

合宙Air724UG Cat.1模块硬件设计指南--看门狗

概述 Air724UG 内部已经自带了看门狗&#xff0c;4秒进行一次喂狗&#xff0c;如果主芯片异常死机&#xff0c;自带的看门狗15秒左右会硬件复位主芯片。 另外主芯片死机情况下&#xff0c;reset键也可以硬重启。 通常情况下不需要外加硬件看门狗&#xff0c;如果对系统稳定性有…

FreeRTOS和uC/OS:选择入手哪个RTOS更合适?

FreeRTOS和uC/OS是两个流行的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;用于嵌入式系统开发。它们有一些区别&#xff0c;但选择哪个先入手取决于你的需求和项目要求。 复杂度&#xff1a;FreeRTOS是一个相对较简单的RTOS&#xff0c;它专注于提供基本的实时调度和…

西门子Mendix 入门 3

导航页面&#xff1a;用于在应用程序中添加或修改其他页面 创建查看查看和添加公司不同部门的页面 打开导航页面&#xff0c;添加新项目 选择TaskTracke新建一个名为Department_Overview的页面&#xff0c;并选择List作为模板 创建成功 现在转到 Department_Overview页面 链接数…

揭秘2023年项目管理软件排行榜实力榜

在现代的商业世界中&#xff0c;项目管理是必不可少的一个组成部分。为了成功地管理一个项目&#xff0c;项目经理需要实施一种系统化的方法来确保项目在时间和预算的约束下成功。这就需要使用专业的项目管理软件。因此&#xff0c;项目管理软件在商业领域中扮演着至关重要的角…

管理类联考——逻辑——知识篇——分析推理——一、排序——haimian

排序 题型特征 排序题通常是依据大小、时间、名次和前后等条件将几个元素有序地排在若干连续排列的位置上。解题时要找出一个对整个排列起决定作用的条件&#xff0c;然后涉及先后位置的条件尽可能结合起来进行解题。 思维导图 思路点拨 注意选项的模式&#xff0c;如果已经…

阿维塔进攻全场景NCA:“遥遥领先”能否赢得市场买单?

阿维塔正在高阶智驾的落地上奋力探索。 “在阿维塔上面&#xff0c;长安汽车、华为、宁德时代做了非常深层次的合作”&#xff0c;6月15日&#xff0c;阿维塔科技副总裁、首席营销官CMO 李鹏程称。当天&#xff0c;阿维塔邀请媒体走进深圳华为坂田基地的华为智能汽车解决方案展…

Autonomous Vehicles Learning Notes

文章目录 自动驾驶感知传感器多模态传感器融合BEVCorner Cases 缩写 未完待续。。。 自动驾驶 来自&#xff1a;浅谈自动驾驶技术与挑战 L0&#xff1a;主动刹车、盲点监测、车道偏离预警和车身稳定系统都属于 L0 级别的自动驾驶&#xff1b; L1&#xff1a;如车道保持系统&a…

MongoDB聚合查询(二)

MongoDB聚合查询 什么是聚合查询 聚合操作主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值组合在一起&#xff0c;按条件分组后&#xff0c;再进行一系列操作&#xff08;如求和、平均值、最大值、最小值&#xff09;以返回单个结果。 MongoDB的聚合查询 聚合是…

springboot+vue学生档案借阅管理系统_8xpgg-

随着社会的不断进步与发展&#xff0c;人们对生活质量要求逐步提升。如果开发一款档案管理系统&#xff0c;可以让学生在最短的时间里享受到最好的服务&#xff1b;而开发本系统&#xff0c;又能够提高系统整体工作水平&#xff0c;简化工作程序&#xff0c;这对管理员和学生来…

【算法题】数组系列(找出数组中重复的数字、二维数组中的查找)

算法题 数组系列 一、找出数组中重复的数字1.1、题目1.2、解题思路1&#xff08;排序法&#xff09;1.3、解题思路2&#xff08;hash&#xff09;1.4、小结 二、二维数组中的查找2.1、题目2.2、理解题目2.3、解题思路2.3.1、暴力枚举2.3.2、二分查找2.3.3、对角线查询&#xff…

【数据结构与算法C++实现】3、排序算法

原视频为左程云的B站教学 以下所有的swap()函数&#xff0c;函数定义为 void swap(int& a, int& b) {int t a;a b;b t; } // 也可以用异或&#xff0c;但不能传入同一个变量&#xff0c;可以是不同变量相同值 void swap(int& a, int& b) {a a ^ b;b a ^ …

极智开发 | 让wsl2读取宿主机usb设备

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文介绍一下 让wsl2读取宿主机usb设备的方法。 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码下载&#xff0c;链接&#xff1a;…

高效处理消息:使用Spring Boot实现消息重试机制

当涉及到消息发送和接收的可靠性&#xff0c;Spring Boot提供了一些机制来确保消息的可靠传递。其中包括消息确认机制和重试机制。下面是一个示例代码&#xff0c;演示如何在Spring Boot中实现可靠的消息发送和接收。 首先&#xff0c;我们需要配置RabbitMQ的连接信息和相关属性…

58 KVM工具使用指南-应用 LibcarePlus 热补丁

文章目录 58 KVM工具使用指南-应用 LibcarePlus 热补丁58.1 前期准备58.2 加载热补丁58.3 查询补丁58.4 卸载热补丁 58 KVM工具使用指南-应用 LibcarePlus 热补丁 本节以原文件 foo.c 和补丁文件 bar.c 为例&#xff0c;介绍 LibcarePlus 热补丁的应用指导。 58.1 前期准备 …

小小面试题之赛马问题

各家大厂面试时都喜欢出一些逻辑题&#xff0c;简单的考验一下应试者的逻辑思维能力。 题目是&#xff1a;现在有64匹赛马和8条赛道&#xff0c;最少需要多少轮比赛才能选出最快的4匹马。 依据现实情况来说&#xff0c;这个问题很好回答。需要经过小组赛&#xff0c;16强赛&am…

王道操作系统学习笔记(2)——进程管理

前言 本文介绍了操作系统中的进程管理&#xff0c;文章中的内容来自B站王道考研操作系统课程&#xff0c;想要完整学习的可以到B站官方看完整版。 二&#xff1a;进程管理 2.1.1&#xff1a;进程的概念、组成、特征 程序&#xff1a;是静态的&#xff0c;就是存放在磁盘里的…

【好书精读】网络是怎样连接的 —— UDP 协议的收发操作

&#xff08; 该图由我使用 AI 绘制 &#xff09; 目录 不需要重发的数据用 UDP 发送更高效 控制用的短数据 音频和视频数据 不需要重发的数据用 UDP 发送更高效 DNS 服务器查询 IP 地址的时候我们用的是 UDP 协议 简单的说就是&#xff0c;TCP之所以复杂&#xff0c;是…

3-css高级特效-1

01-平面转换 简介 作用&#xff1a;为元素添加动态效果&#xff0c;一般与过渡配合使用 概念&#xff1a;改变盒子在平面内的形态&#xff08;位移、旋转、缩放、倾斜&#xff09; 平面转换也叫 2D 转换&#xff0c;属性是 transform 平移 transform: translate(X轴移动距…

Jetpack Compose 入门难点解疑

作者&#xff1a;晴天小庭 近些年声明式布局开发方式逐渐从网页端延展到了手机端&#xff0c;说到底还是声明式太香了&#xff0c;其代码更加清晰、简洁&#xff0c;并且更接近于自然语言的表达方式。这使得代码易于理解和维护&#xff0c;降低了开发人员的心智负担。 谷歌和苹…