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

题目描述 

众所周知,佳爷是集训队最强,他经常喜欢鄙视集训队最菜的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;
}

  

么就是符合题意的



猜你喜欢

转载自www.cnblogs.com/clb123/p/12045934.html