2019-2020"新生赛"长沙理工大学程序设计竞赛E题合法括号
Posted clb123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
么就是符合题意的
以上是关于2019-2020"新生赛"长沙理工大学程序设计竞赛E题合法括号的主要内容,如果未能解决你的问题,请参考以下文章
湖南大学ACM程序设计新生杯大赛(同步赛)B - Build
湖南大学ACM程序设计新生杯大赛(同步赛)L - Liao Han
湖南大学ACM程序设计新生杯大赛(同步赛)A - Array