E - Parentheses

Time Limit:2000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Description

E - Parentheses

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 nnstrings 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个字符串的位置使得
最后没有任何字符留下;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf =0x7f7f7f7f;
const double pi=acos(-1);
const int maxn=40000; struct node {
int x,y;
bool operator<(const node&a) const{
return this->x<a.x;
}
};
vector<node> A,B;
char s[10000];
int main()
{
int n;
while(~scanf("%d",&n))
{
A.clear();B.clear();
for(int i=1;i<=n;i++)
{
scanf("%s",s);
int l=0,r=0;
for(int j=0;s[j]!='\0';j++)
{
if(s[j]=='(') r++;
else if(!r) l++;
else r--;
}
if(l>r) B.push_back(node{r,l-r});
else A.push_back((node){l,r-l});
} sort(A.begin(),A.end());
sort(B.begin(),B.end());
int cntA=0,cntB=0; bool flag=true;
for(int i=0;i<A.size();i++)
{
if(A[i].x>cntA) {flag=false;break;}
cntA+=A[i].y;
} for(int i=0;i<B.size();i++)
{
if(B[i].x>cntB) {flag=false;break;}
cntB+=B[i].y;
} if(cntA!=cntB) flag=false;
printf("%s\n",flag?"Yes":"No");
}
return 0;
}
分析:这道题做了很久,其实我的思路大部分是正确的,有几个值得改进的地方:
1.字符串的处理上,我是直接对字符进行移动,而简洁的做法就是直接统计;
我的

while(1)
{
int flag=0;
for(int i=0;s[i+1]!='\0';i++)
{
if(s[i]=='('&&s[i+1]==')')
{
int j;
for(j=i+2;s[j]!='\0';j++)
s[j-2]=s[j];
s[j-2]='\0';
flag=1;
}
if(flag) break;
}
if(!flag) return;
}

  简洁:

for(int j=0;s[j]!='\0';j++)
{
if(s[j]=='(') r++;
else if(!r) l++;
else r--;
}

  2.最后对右边的处理也不是任意的,比如(((((和右边的)))( ,))))((( , ))左边的与右边的不能任意结合

我的wa代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf =0x7f7f7f7f;
const double pi=acos(-1);
const int maxn=40000; char s[100000+10];
int cntl[14],cntr[14],n,l=0,r=0,kk,p,flag[15],used[15]; void init()
{
while(1)
{
int flag=0;
for(int i=0;s[i+1]!='\0';i++)
{
if(s[i]=='('&&s[i+1]==')')
{
int j;
for(j=i+2;s[j]!='\0';j++)
s[j-2]=s[j];
s[j-2]='\0';
flag=1;
}
if(flag) break;
}
if(!flag) return;
}
} struct node{
int id,cntr;
};
bool operator<(node a,node b)
{
return a.cntr<b.cntr;
}
void solve()
{
int l=0;
for(int i=1;i<=n;i++)
if(cntl[i]&&!cntr[i]) {l+=cntl[i];used[i]=1;} if(l==0) {printf("No\n");return;} priority_queue<node> q;
for(int i=1;i<=n;i++)
if(!used[i]&&cntl[i]>=cntr[i])
q.push((node){i,cntr[i]}); while(q.size())
{
node u=q.top();q.pop();
int i=u.id;
if(l<cntr[i]) {printf("No\n");return;}
l+=cntl[i];
l-=cntr[i];
used[i]=1;
} for(int i=1;i<=n;i++)
if(!used[i]&&cntl[i])
{
if(l<cntr[i]) {printf("No\n");return;}
l-=cntr[i];
l+=cntl[i];
used[i]=1;
} for(int i=1;i<=n;i++)
if(!used[i])
{
if(l<cntr[i]) {printf("No\n");return;}
l-=cntr[i];
used[i]=1;
}
if(l) {printf("No\n");return;}
else {printf("Yes\n");return;}
} int main()
{
while(~scanf("%d",&n))
{
MM(cntl,0);MM(cntr,0);MM(used,0);
p=n;l=r=kk=0;
for(int k=1;k<=n;k++)
{
scanf("%s",s);
init();
for(int i=0;s[i]!='\0';i++)
if(s[i]=='(') cntl[k]++;
else if(s[i]==')') cntr[k]++;
if(!cntl[k]&&!cntr[k]) p--;
}
if(p==0) {printf("Yes\n");continue;}
solve();
}
return 0;
}

  

 

  

 

#4 div1E Parentheses 括号匹配的更多相关文章

  1. 20. Valid Parentheses(括号匹配,用桟)

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...

  2. 20. Valid Parentheses - 括号匹配验证

    Description: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determin ...

  3. leetcode 20 Valid Parentheses 括号匹配

    Given a string containing just the characters '(', ')', '{', '}', '[' and']', determine if the input ...

  4. 《LeetBook》leetcode题解(20):Valid Parentheses[E]——栈解决括号匹配问题

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  5. LeetCode 20 Valid Parentheses (括号匹配问题)

    题目链接 https://leetcode.com/problems/valid-parentheses/?tab=Description   Problem: 括号匹配问题. 使用栈,先进后出!   ...

  6. 2.Valid Parentheses (括号匹配)

    Level: ​  Easy 题目描述: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', ...

  7. 栈应用之 括号匹配问题(Python 版)

    栈应用之 括号匹配问题(Python 版) 检查括号是否闭合 循序扫描被检查正文(一个字符)里的一个个字符 检查中跳过无关字符(所有非括号字符都与当前处理无关) 遇到开括号将其压入栈 遇到闭括号时弹出 ...

  8. Leetcode 856. Score of Parentheses 括号得分(栈)

    Leetcode 856. Score of Parentheses 括号得分(栈) 题目描述 字符串S包含平衡的括号(即左右必定匹配),使用下面的规则计算得分 () 得1分 AB 得A+B的分,比如 ...

  9. 利用栈实现括号匹配(python语言)

    原理: 右括号总是与最近的左括号匹配 --- 栈的后进先出 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 当最终右括 ...

随机推荐

  1. yum源配置、epel源配置

    关键词:yum源,本地yum源,网络yum源   [1]配置本地yum源 1.挂载好光盘到/redhat/mnt/mnt下 mount /dev/cdrom /mnt 2.操作 cd /etc/yum ...

  2. failed to push some refs to 'git@github.com:cq1415583094/MyBatis.git'解决办法

    将本地git仓库代码提交到GitHub上时,出现failed to push some refs to 'git@github.com:cq1415583094/MyBatis.git', 导致的原因 ...

  3. CF387B 【George and Round】

    暴力还真的出奇迹了这题窝将读入的两个数组都先排个序,然后再枚举一遍就过了: 目前题解最短的代码QwQ.这里是代码 #include<bits/stdc++.h>using namespac ...

  4. Windows 系统安装 Docker

    详细方法参见官方文档. Win10 家庭版 安装Toolbox Win10 家庭版由于功能限制,不能直接安装 Docker for Windows, 需要使用 Toolbox 的形式进行安装. 确认版 ...

  5. Abp添加新的接口(扩展底层接口)

    在https://aspnetboilerplate.com/Templates 创建项目之后,下载用Vs2019打开(vs2017不支持netcore3.0)结构如下: 一. 2. 在xx.core ...

  6. 编写 Bash 补全脚本

    编写 Bash 补全脚本   对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. B ...

  7. 三剑客-sed(简写)

    打印操作:n命令所有行打印,第二行打印两遍 sed '2p' passwd只打印第二行sed -n '2p' passwd打印1~3行 sed -n '1,3p' passwd 打印带有'root'的 ...

  8. axios+FormData文件上传

    axios+FormData文件上传 原理:FormData上传 创建一个FormData对象,将得到的文件流对象放在FormData内,然后使用axios上传 注意: 1.请求头设置 headers ...

  9. java中的全局变量、局部变量与静态常量的区别

    java中的变量类型分类: 类变量:独立于方法之外的变量,用 static 修饰.实例变量:独立于方法之外的变量,不过没有 static 修饰.局部变量:类的方法中的变量.比如: public cla ...

  10. 微信小程序wx.showActionSheet调用客服信息功能

    微信小程序wx.showActionSheet调用客服消息功能 官方文档的代码: wx.showActionSheet({ itemList: ['A', 'B', 'C'], success (re ...