jzyzoj 栈——P1148:括号匹配加强版
括号匹配加强版
描述 Description
对于一个由(,),[,]括号组成的字符串,求出其中最长的括号匹配字串。 具体来说,满足如下条件的字符串成为括号匹配的字符串: (1) (),[] 是括号匹配的字符串。 (2) 若A是括号匹配的串,则(A)或[A] 是括号匹配的字符串。 (3) 若A和B都是括号匹配的字符串,则A+B也是括号匹配的字符串。(这里的+是字符串的加法运算)。 例如:(),[],([]),()() 都是括号匹配的字符串,而][,[( ]),(]则不是。 字符串A的子串是指由A中连续若干个字符组成的字符串。例如:A,B,C,ABC,CAB,ABCCABC都是ABCABC的子串。空串是任何字符串的子串。
输入格式 Input Format
输入一行,为一个仅由()[]组成的非空字符串。(括号都是英文输入法的括号)
输出格式 Output Format
输出也仅有一行,为最长的括号匹配子串。若有相同长度的子串,输出位置靠前的子串。
样例输入 Sample Input
【输入样例1】 ([(][()]]()
【输入样例2】 ())[]
样例输出 Sample Output
【输出样例2】 [()]
【输出样例2】 ()
时间限制 Time Limitation 1s
注释 Hint 【数据规模】 对于20%的数据,字符串长度<=100 对于50%的数据,字符串长度<=10,000 对于100%的数据,字符串长度<=1,000,000
思路:这道题栈的经典应用,需要注意的就是如果不匹配栈需要清空。对于题上给的 A匹配,B匹配,则A+B匹配 我们可以把每个匹配的bool标记,这样最后枚举的时候 for i=1.....n bool[i]=1 肯定是连续的。
代码:
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int stack[];
int top=;
//char ans[1000100];
char c[];
bool f[];
int n=;
//int len=0;
//int id=0;
//int t=0;
inline void push(int x)
{
stack[++top]=x;
} void check(int i)
{
//cout<<stack[top]<<' ';
if(top>)
{
if(c[stack[top]]=='(')
{
if(c[i]==']') top=;
else if(c[i]=='('||c[i]=='[') push(i);
else if(c[i]==')')
{
f[stack[top]]=;
f[i]=;
--top;
}
}
else if(c[stack[top]]=='[')
{
if(c[i]==')') top=;
else if(c[i]=='('||c[i]=='[') push(i);
else if(c[i]==']')
{
f[i]=;
f[stack[top]]=;
--top;
}
}
else if((c[stack[top]]==')')||(c[stack[top]]==']'))
{
top=;
push(i);
}
}
else
{
//cout<<"ccccc:"<<i<<' ';
if((c[i]!=']')||(c[i]!=')'))
{
push(i);
}
else return;
}
//cout<<stack[top]<<' ';
} void work()
{
int id;
int len=;
int ans=;
//for(int i=1;i<=n;i++) cout<<f[i]<<' ';cout<<endl;
for(int i=;i<=n;++i)
{
//cout<<f[i]<<' ';
if(f[i])
{
++len;
int t=i+;
while(f[t])
{
++len;
++t;
}
i=t-;
if(len>ans)
{
ans=len;
id=i-len+;
}
len=;
}
}
//cout<<"id:"<<id<<endl;
//cout<<"ans:"<<ans<<endl;
for(int i=id;i<=id+ans-;++i)
{
printf("%c",c[i]);
}
} int main()
{
//freopen("a.txt","r",stdin);
//freopen("b.txt","w",stdout);
memset(f,,sizeof(f));
char ch;
ch=getchar();
while(ch>=)
{
c[++n]=ch;
//cout<<c[n]<<' ';
ch=getchar();
}
//cout<<endl;
//cout<<"n:"<<n<<endl;
for(int i=;i<=n;++i)
{
check(i);
}
//cout<<endl;
work();
return ;
}
jzyzoj 栈——P1148:括号匹配加强版的更多相关文章
- STL-stack和顺序栈实现括号匹配
2018-11-11-14:28:31 1.顺序栈 下面是我用数组实现的顺序栈,包含的函数有出入栈,查看栈顶元素,栈的大小,栈是否空等函数,当栈空间不够用时,对应的数组会自动增长. /******** ...
- HDU 4283 You Are the One ★(进出栈的括号匹配性质:区间DP)
题意 有一个队列,每个人有一个愤怒值D,如果他是第K个上场,不开心指数就为(K-1)*D.但是边上有一个小黑屋(一个FILO堆栈),可以一定程度上调整上场程序,求一种安排上场方案使得所有人的不开心指数 ...
- OJP1147括号匹配加强版(栈)与P1153乱头发节(单调栈)
惨兮兮的被刷掉2%的通过率后在经过思考和dalao的指点后终于A掉了这道题 强烈建议修改这题的样例,实在太迷惑人,各种错误算法都能过 比如说这是一份错误代码,看懂了也不要学思路,和正解不知道差到哪里去 ...
- C语言数据结构之栈:括号匹配
括号匹配这是个很简单的题目,如果只有小括号,就模拟进栈和出栈的过程就行了: 注:输入时'@'作为结束标志 #include <stdio.h> int main() { freopen(& ...
- 利用顺序栈解决括号匹配问题(c++)-- 数据结构
题目: 7-1 括号匹配 (30 分) 给定一串字符,不超过100个字符,可能包括括号.数字.字母.标点符号.空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入格式: 输入在一行 ...
- 《LeetBook》leetcode题解(20):Valid Parentheses[E]——栈解决括号匹配问题
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- Python面试题:使用栈处理括号匹配问题
括号匹配是栈应用的一个经典问题, 题目 判断一个文本中的括号是否闭合, 如: text = "({[({{abc}})][{1}]})2([]){({[]})}[]", 判断所有括 ...
- 利用栈实现括号匹配(python语言)
原理: 右括号总是与最近的左括号匹配 --- 栈的后进先出 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 当最终右括 ...
- 栈之括号匹配问题(java实现)
假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先 ...
随机推荐
- #3 working with data stored in files && securing your application (PART II)
Security problems is more and more important on the internet today. You can see the problems . This ...
- [原]sencha touch之carousel
carousel组件是个非常不错的东东,自带可滑动的效果,效果如下图 上面部分可以左右滑动,下面部分可以上下滑动,效果还是不错的,app程序中很有用的布局 代码如下: Ext.application( ...
- Wireshark启动出现“无法启动此程序,因为计算机丢失api-ms-win-crt-runtime-l1-1-0.dll。”
由于重装了win7系统,安装wireshark启动出现了“无法启动此程序,因为计算机丢api-ms-win-crt-runtime-l1-1-0.dll”的问题. 网上查了一圈的资料终解决问题,于是整 ...
- Algorithms(fourth edition)——无向图
1.设计图基本操作API 2.用什么数据结构来表示图并实现API 要求:(1)要预留足够空间 (2)实例方法实现要快 三个选择: 邻接矩阵:布尔矩阵,不满足条件一,而且无法表示平行边 边的数组:不满足 ...
- 数据库脚本开发日志模板 —— 项目需求 A
前言: 在经历的几家公司的多个项目开发管理中,用 git 或者 svn来管理项目代码,都着重项目代码的管理,却疏于相应脚本的管理.本文可以参考,作为项目需求对应脚本开发记录文件(也建议用单个文件夹下放 ...
- MFC深入浅出读书笔记第二部分1
第六章 MFC程序的生死因果 MFC学习过程,这个方法不错,条例清晰. 1.CWinApp -- 取代WinMain地位 WinMain函数的功能由CWinApp的三个函数实现 virtual BO ...
- [netty4][netty-common]Future与Promise分析
接口与类结构体系 -- [I]java.util.concurrent.Future<V> ---- [I]io.netty.util.concurrent.Future<V> ...
- Unity开发VR——Oculus Rif_将Oculus接入Unity
该文档基于 Unity2018.3.12f1 1. 搭建简单场景 2. 设置,选择 Edit - Project Setting(若已经勾选,就去掉在勾选一次) 完成该步骤之后,可以带上Oculus头 ...
- 关于在smarty中实现省市区三级联动
刚开始接触php,,其实对于一些比较深入的东西还不是很了解,就像是这次的省市区联动,都是用三张表为基础编码的,原谅我的无知,谢谢. 接下来就是编码部分了: <?php require('./sm ...
- [python]做一个简单爬虫
为什么选择python,它强大的库可以让你专注在爬虫这一件事上而不是更底层的更繁杂的事 爬虫说简单很简单,说麻烦也很麻烦,完全取决于你的需求是什么以及你爬的网站所决定的,遇到的第一个简单的例子是pas ...