Aizu - 2681(括号匹配)
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(括号匹配)的更多相关文章
- 括号匹配 区间DP (经典)
描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来 ...
- YTU 3003: 括号匹配(栈和队列)
3003: 括号匹配(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 [提交][状态][讨论版] 题目描述 假设一个表达式中只允许包含三种括号:圆括号&quo ...
- [原]NYOJ 括号匹配系列2,5
本文出自:http://blog.csdn.net/svitter 括号匹配一:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 括号匹配二:htt ...
- POJ C程序设计进阶 编程题#4:括号匹配问题
编程题#4:扩号匹配问题 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 在某 ...
- 南阳理工ACM 括号匹配问题,并求出使得括号能够匹配需要新增的最小括号数(括号匹配(二))
描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起 ...
- 【栈思想、DP】NYOJ-15 括号匹配(二)
括号匹配(二) 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能 ...
- NYOJ 题目15 括号匹配(二)(区间DP)
点我看题目 题意 : 中文题不详述. 思路 : 本来以为只是个小模拟,没想到是个区间DP,还是对DP不了解. DP[i][j]代表着从字符串 i 位置到 j 位置需要的最小括号匹配. 所以初始化的DP ...
- C语言数据结构之栈:括号匹配
括号匹配这是个很简单的题目,如果只有小括号,就模拟进栈和出栈的过程就行了: 注:输入时'@'作为结束标志 #include <stdio.h> int main() { freopen(& ...
- [NYOJ 15] 括号匹配(二)
括号匹配(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[&qu ...
随机推荐
- 4.1.6 Grundy数-硬币游戏2
Problem Description: Alice 和 Bob 在玩一个游戏.给定 k 个数字 a1,a2,……,ak.一开始,有n堆硬币,每堆各有 Xi 枚硬币.Alice 和 Bob 轮流选出一 ...
- linux系统下pdf操作软件pdftk
二十一.pdf操作软件pdftk pdftk是一个命令行程序,使用计算机终端进行操作. 1.第一步:安装pdftk windows:https://www.pdflabs.com/tools/pdft ...
- 报错 hint: Updates were rejected because the remote contains work that you do 解决方法
1. git pull origin master --allow-unrelated-histories 2.git pull origin master 3.git init 4.git remo ...
- NestedScrollView嵌套ListView时只显示一行的解决方法
在使用CoordinatorLayout和AppBarLayout实现嵌套滑动的时候,出现listview没有嵌套滑动: 如果要实现嵌套滑动,则需要添加NestedScrollView,但是结果发现l ...
- Plus One leetcode java
问题描述: Given a non-negative number represented as an array of digits, plus one to the number. The dig ...
- java类的设计原则
1.内聚性 类应该描述一个单一的实体,所有的类操作应该在逻辑上相互配合,支持一个连贯性的目标.例如:学生和教职工属于不同的实体,应该定义两个类. 2.一致性 要遵循一定的设计风格和命名习惯.给类.方法 ...
- python-爬虫-Beautifulsoup模块
一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...
- Hadoop中 Unable to load native-hadoop library for your platform... using builtin-java classes where applicable问题解决
环境 [root@vm8028 soft]# cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m [root@vm8028 sof ...
- Oracle中的instr()函数 详解及应用
1)instr()函数的格式 (俗称:字符查找函数) 格式一:instr( string1, string2 ) / instr(源字符串, 目标字符串) 格式二:instr( strin ...
- Linux确认网口对应配置文件
服务器经常是多网卡多网口,我们在某个网口插上网线后,到/etc/sysconfig/network-scripts/下配置ip时需要确定插上网线的网口对应的是哪个配置文件(比如是eth0还是eth1) ...