字符串匹配问题——带有优先级的括号匹配问题

字符串 同时被 2 个专栏收录
5 篇文章 0 订阅
37 篇文章 0 订阅

题目描述

字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包 含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]),([)]都应该 输出 NO。

输入

第一行为一个整数 n,表示以下有多少个由括好组成的字符串。接下来的 n 行, 每行都是一个由括号组成的长度不超过 255 的字符串。

输出

有 n 行(n≤20),每行都是 YES 或 NO。

样例输入

5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]

样例输出

YES
YES
YES
YES
NO
#include <bits/stdc++.h>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define wuyt main
typedef long long ll;
template<class T> inline T min(T &x,const T &y){return x>y?y:x;}
template<class T> inline T max(T &x,const T &y){return x<y?y:x;}
ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();
if(c == '-')Nig = -1,c = getchar();
while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();
return Nig*x;}
#define read read()
const ll inf = 1e15;
const int maxn = 2e5 + 7;
const int mod = 1e9 + 7;
char ss[maxn];
int num[maxn];
int main(){
    ll n=read;
    while(n--)
    {
        cin>>ss;
        for(int i=0;i<strlen(ss);i++)
        {
            if(ss[i]=='<') num[i]=1;
            else if(ss[i]=='>') num[i]=2;
            else if(ss[i]=='(') num[i]=3;
            else if(ss[i]==')') num[i]=4;
            else if(ss[i]=='[') num[i]=5;
            else if(ss[i]==']') num[i]=6;
            else if(ss[i]=='{') num[i]=7;
            else if(ss[i]=='}') num[i]=8;
         }
         stack<int> s;
         bool flag=true;
         for(int i=0;i<strlen(ss);i++)
         {
             if(s.empty()) s.push(num[i]);
             else{
                if(num[i]%2==1){
                    if(num[i]<=s.top()) s.push(num[i]);
                    else {
                        flag=false;
                        break;
                    }
                }
                else if(num[i]-1==s.top())
                    s.pop();
             }
         }
         if(s.empty()&&flag) printf("YES\n");
         else printf("NO\n");
    }
	return 0;
}

  • 2
    点赞
  • 0
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:终极编程指南 设计师:CSDN官方博客 返回首页

打赏作者

PushyTao

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值