E-括号匹配(栈类的思想运用)

别等时光非礼了梦想. 提交于 2019-12-15 23:50:51

题目链接: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\n");
            return 0;
        }
    }
    if (sum>0) printf ("NO\n");
    else printf ("YES\n");
    return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!