Problem Statement

You are given nn strings str1,str2,…,strnstr1,str2,…,strn, each consisting of ( and ). The objective is to determine whether it is possible to permute the nn strings so that the concatenation of the strings represents a valid string.

Validity of strings are defined as follows:

  • The empty string is valid.
  • If AA and BB are valid, then the concatenation of AA and BB is valid.
  • If AA is valid, then the string obtained by putting AA in a pair of matching parentheses is valid.
  • Any other string is not valid.

For example, "()()" and "(())" are valid, while "())" and "((()" are not valid.

Input

The first line of the input contains an integer nn (1≤n≤1001≤n≤100), representing the number of strings. Then nn lines follow, each of which contains stristri (1≤|stri|≤1001≤|stri|≤100). All characters in stristri are (or ).

Output

Output a line with "Yes" (without quotes) if you can make a valid string, or "No" otherwise.

Sample Input 1

3
()(()((
))()()(()
)())(())

Output for the Sample Input 1

Yes

Sample Input 2

2
))()((
))((())(

Output for the Sample Input 2

No
题意:给你n个字符串(只包含 “(” 和 “)” ),问是否能通过排序使得这n个字符串组成的大字符串合法
思路:根据题目给出的字符串,我们先可以对它进行预处理,消除掉已经配对的左右括号,最后得到的一定是像“))(((”这样的字符串,然后我们就可以把它分为右括号多和左括号多的两个数组(假设他们
分别是数组a和数组b),我们可以分别对这两个数组中的左括号数和右括号数进行排序(为什么我们要对它进行排序呢,对于数组a,它里面所有的数据都是右括号数大于左括号数,所有我们要想让它成为
一个合法的序列,我们就要尽可能的让少的左括号来与当前多出来的右括号来配对(如果你当前的要配对的左括号的数量大于多出来的右括号,剩下的没有被配对的左括号就消除不了了,则它不可能会是一个
合法的序列)),最后就看a数组进行消除后剩下的右括号数是否等于b数组进行消除后剩下的左括号数。
代码:
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
struct st{
int x,y;
bool operator <(const st& a)const{//重载小于号
return x<a.x;
}
};
char c[110];
vector<st> a,b;
int main(){
int n;
int len;
int l,r;
int i,j;
st k;
scanf("%d",&n);
for(i=0;i<n;i++){
getchar();
scanf("%s",c);
len=strlen(c);
l=r=0;
for(j=0;j<len;j++){//进行预处理,消除可以配对的括号
if(c[j]==')'){
if(r!=0)
r--;//记录左括号数
else
l++;//记录右括号数
}
else
r++;
}
if(l>r){//左括号多 ,放入b数组
k.x=r;
k.y=l;
b.push_back(k); }
else{//右括号多
k.x=l;
k.y=r;
a.push_back(k);
}
}
sort(a.begin(),a.end());//从小到大排序
sort(b.begin(),b.end());
int lg=1;//标记它是否合法
int a1,b1;
a1=b1=0;
for(i=0;i<a.size()&≶i++){
if(a1<a[i].x)//当前没配对的右括号数不能把当前放入的左括号全部抵消掉,不合法
lg=0;
else
a1=a1-a[i].x+a[i].y;//消除配对的括号
}
for(i=0;i<b.size()&≶i++){//同上
if(b1<b[i].x)
lg=0;
else
b1=b1-b[i].x+b[i].y;
}
if(a1==b1&&lg)//最后剩余的左右括号数量要相等
printf("Yes\n");
else
printf("No\n");
return 0;
}

  

												

Aizu - 2681(括号匹配)的更多相关文章

  1. 括号匹配 区间DP (经典)

    描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来 ...

  2. YTU 3003: 括号匹配(栈和队列)

    3003: 括号匹配(栈和队列) 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版] 题目描述 假设一个表达式中只允许包含三种括号:圆括号&quo ...

  3. [原]NYOJ 括号匹配系列2,5

    本文出自:http://blog.csdn.net/svitter 括号匹配一:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 括号匹配二:htt ...

  4. POJ C程序设计进阶 编程题#4:括号匹配问题

    编程题#4:扩号匹配问题 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 在某 ...

  5. 南阳理工ACM 括号匹配问题,并求出使得括号能够匹配需要新增的最小括号数(括号匹配(二))

    描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起 ...

  6. 【栈思想、DP】NYOJ-15 括号匹配(二)

    括号匹配(二) 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能 ...

  7. NYOJ 题目15 括号匹配(二)(区间DP)

    点我看题目 题意 : 中文题不详述. 思路 : 本来以为只是个小模拟,没想到是个区间DP,还是对DP不了解. DP[i][j]代表着从字符串 i 位置到 j 位置需要的最小括号匹配. 所以初始化的DP ...

  8. C语言数据结构之栈:括号匹配

    括号匹配这是个很简单的题目,如果只有小括号,就模拟进栈和出栈的过程就行了: 注:输入时'@'作为结束标志 #include <stdio.h> int main() { freopen(& ...

  9. [NYOJ 15] 括号匹配(二)

    括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 给你一个字符串,里面只包含"(",")","[&qu ...

随机推荐

  1. Practical Node.js (2018版) 第4章: 模版引擎

    Template Engines: Pug and Handlebars 一个模版引擎是一个库或框架.它用一些rules/languages来解释data和渲染views. web app中,view ...

  2. apiCloud 双击事件

    apiCloud 双击事件只能使用纯js去写 var app = new Vue({ el: "#app", data: function() { return { token: ...

  3. Android测试(二)——drozer使用

    drozer启动: 1)首先在模拟 器或者安卓设备上开启drozer; 2)然后打开adb,转发端口: adb forward tcp:31415 tcp:31415 3)在电脑上开启drozer: ...

  4. php文件包含漏洞(利用phpinfo)复现

     利用docker复现该漏洞,访问http://192.168.80.156:8080/phpinfo.php,可以看到页面出现phpinfo页面 再访问http://192.168.80.156:8 ...

  5. Spring boot(三)在Spring boot中Redis的使用

    spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...

  6. vue路由守卫应用,监听是否登录

    路由跳转前做一些验证,比如登录验证,是网站中的普遍需求. 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards). 导航守卫 ...

  7. rac 关库 启库

    关库顺序 先关闭数据库 然后关闭节点资源 [root@rac1 ~]# srvctl stop   database  -d prod[root@rac1 ~]# srvctl stop   inst ...

  8. 33 个 2017 年必须了解的 iOS 开源库

    本文翻译自Medium,原作者为Pawe? Bia?ecki 照片版权:(Unsplash/Markus Pe) 你好,iOS 开发者们!我的名字叫 Pawe?,我是一个独立 iOS 开发者,并且是  ...

  9. 【转】在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动

    在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...

  10. Android Studio打包生成APK教程

    一.修改版本和指定生成APK文件名[可选] 将项目切换到Project视图,打开app目录下的build.gradle文件 1.1 修定软件版本 如1.2图所示. versionCode是app的大版 ...