题目链接:http://acm.csust.edu.cn/problem/3032
Description
众所周知,佳爷事集训队最强,他经常喜欢鄙视集训队最菜的PC,这天他又来了,他丢给PC一道题目:
给你一个字符串,该字符串值包含符号 '(’ 和 ‘)', ,我们称那些左右括号可以一一对应的括号字符串为完美字符串,
比如"()()()", "((()))", "((()))()()", 都是完美字符串
而"((())", "()(", "((()))()(" 不是完美字符串。
这么难的题目,PC当然是不会写的,但他又不想被佳爷鄙视,所以他找到了你,聪明的ACMer啊,请你帮PC解出这题把
Input
第一行一个整数n,代表字符串的长度 n, 1 <= n <= 1e5
第二行一串字符串s,只包含字符 '(' , ')'。
Output
如果该字符串是完美字符串,就输出YES,。否则输出NO
Sample Input 1
4 (())
Sample Output 1
YES
Sample Input 2
5 ((())
Sample Output 2
NO
这个就是个简单的栈的理解运用,用sum记录一个数据,在遇到’(‘则加一,遇到’)’则减一,在从前往后扫描的过程中,sum始终不为负数,并且扫描完成后sum等于0输出YES即可。
以下是AC代码:
#include <bits/stdc++.h> using namespace std; const int mac=1e5+10; char s[mac]; int main() { int n; scanf ("%d",&n); scanf ("%s",s+1); int sum=0; for (int i=1; i<=n; i++){ if (s[i]=='(') sum++; else sum--; if (sum<0) { printf ("NO "); return 0; } } if (sum>0) printf ("NO "); else printf ("YES "); return 0; }