字符串匹配问题(strs)

作者 刘昆

单位 中国矿业大学徐海学院

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

输入格式:

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

输出格式:

输出有 n 行,每行都是 YES 或 NO

输入样例:

在这里给出一组输入。例如:

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

输出样例:

在这里给出相应的输出。例如:

YES
YES
YES
YES
NO
#include<iostream>
#include<unordered_map>
#include<string.h>
using namespace std;
const int N=300;
char stk[N];
int tt=0;
int main()
{
    int n;
    cin >> n;
    unordered_map<char,int> pr{{'<',1},{'(',2},{'[',3},{'{',4}};
    while(n--)
    {
        tt=0;
        char op[N];
        cin >> op;
        int m;
        char x;
        m=strlen(op);
        int i;
        bool flag = true;
        for(i=0;i<m;i++)
        {
            if(op[i]=='{' || op[i]=='<' || op[i]=='[' || op[i]=='(')
            {
                stk[++tt]=op[i];
                int j;
                for(j=tt;j>0;j--){
                    if(pr[stk[tt]] > pr[stk[j]])
                    {
                        cout << "NO" << endl;
                        flag = false;
                        break;
                    }
                }
                if(flag == false)
                break;
            }
            else if(op[i]=='}')
            {
                x=stk[tt];
                tt--;
                if(x != '{')
                {
                    cout << "NO"<< endl;
                    flag = false;
                    break;
                }
            }
            else if(op[i]==']')
            {
                x=stk[tt];
                tt--;
                if(x!='[')
                {
                    cout << "NO" << endl;
                    flag = false;
                    break;
                }
            }
            else if(op[i]==')')
            {
                x=stk[tt];
                tt--;
                if(x!='(')
                {
                    cout << "NO" << endl;
                    flag = false;
                    break;
                }
            }
            else{
                x=stk[tt];
                tt--;
                if(x!='<')
                {
                    cout << "NO" << endl;
                    flag = false;
                    break;
                }
            }
        }
        if(flag){
            if(tt > 0)
            {
                cout << "NO" << endl;
            }
            if(tt == 0)
            {
                cout << "YES" << endl;
            }
        }
        
    }
    return 0;
}

 注意:

1.在for前面加一个变量判断,如果输出NO才进行第二个break,不然的话都会走第二个break.

2.应该把flag放在for前面,中间输出NO,然后break跳出for循环,但是for循环下面还有代码会继续执行,如果不满足条件可能还会输出No。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值