码迷,mamicode.com
首页 > 其他好文 > 详细

2019-2020"新生赛"长沙理工大学程序设计竞赛E题合法括号

时间:2019-12-15 21:41:14      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:括号   des   过程   程序   判断   竞赛   namespace   并且   item   

题目描述 

众所周知,佳爷是集训队最强,他经常喜欢鄙视集训队最菜的PC,这天他又来了,他丢给PC一道题目:

给你一个字符串,该字符串只包含符号 ‘(’ 和 ‘)‘, ,我们称那些左右括号可以一一对应的括号字符串为完美字符串,

比如"()()()",  "((()))", "((()))()()", 都是完美字符串

而"((())", "()(", "((()))()(" 不是完美字符串。

这么难的题目,PC当然是不会写的,但他又不想被佳爷鄙视,所以他找到了你,聪明的ACMer啊,请你帮PC解出这题把

输入描述:

第一行一个整数n,代表字符串的长度 n, 1 <= n <= 1e5

第二行一串字符串s,只包含字符 ‘(‘ , ‘)‘。

输出描述:

如果该字符串是完美字符串,就输出YES,。否则输出NO
示例1

输入

4
(())

输出

YES

思路:括号匹配,左右括号应该相等才能满足题意,先判断下n是不是偶数,如果不是偶数,肯定匹配不了,直接输出NO结束。
否则的话就记录下左括号和右括号的数量,并且在每一次的记录中判断是否右括号大于左括号,如果说右括号的数量大于了左括号,
那么肯定没有相应的左括号来匹配,最后判断下如果左右括号数量相等的话输出YES,否则输出NO
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    char a[100100];
    cin>>n;
    getchar();  //读取回车键
    for(int i = 0; i < n; i++) {
        scanf("%c",&a[i]);
    }
    int l = 0,r = 0;
    if(n%2 != 0) {
        cout<<"NO"<<endl;
    }
    else {
        for(int i = 0; i < n; i++) {
            if(a[i] == ‘(‘) {
                l++;
            }
            else if(a[i] == ‘)‘) {
                r++;
            }
            if(l < r) {  //如果说在这个过程中右括号的数量大于左括号,肯定是不能匹配成功的
                cout<<"NO"<<endl;
                return 0;
            }
        }
        if(l == r) {
            cout<<"YES"<<endl;
        }
        else {
            cout<<"NO"<<endl;
        }
    }
    return 0;
}

  

么就是符合题意的



2019-2020"新生赛"长沙理工大学程序设计竞赛E题合法括号

标签:括号   des   过程   程序   判断   竞赛   namespace   并且   item   

原文地址:https://www.cnblogs.com/clb123/p/12045934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!