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


    题目描述

    字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包 含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出: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;
    #define start int wuyt()
    #define end return 0
    /**int dfs(int n,int k)
    {
        if((n==0)||(k==0)||(n<k))
    		return 0;
        if(k==1||n==k)
    		return 1;///only1
        return dfs(n-k,k)+dfs(n-1,k-1);
    }**/
    char ss[maxn];
    int num[maxn];
    start{
        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
    ");
             else printf("NO
    ");
        }
    	end;
    }
    
    

    前面哪一种是错误的方法,没有看到需要考虑类似优先级这样的问题

  • 相关阅读:
    2019年北航OO第三次博客总结
    2019年北航OO第二次博客总结
    2019年北航OO第一次博客总结
    BUAA_OO第四单元总结性博客作业——UML(Floyd实现规则检查?)
    BUAA_OO第三单元总结性博客作业——JML
    BUAA_OO第二单元总结性博客作业——多线程电梯架构
    BUAA_OO第一单元总结性博客作业——表达式求导
    免费虚拟主机 免费云服务器
    .net core API 使用swagger
    Socket学习
  • 原文地址:https://www.cnblogs.com/PushyTao/p/13144167.html
Copyright © 2020-2023  润新知