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实现)
假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先 ...
随机推荐
- 矩阵儿快速幂 - POJ 3233 矩阵力量系列
不要管上面的标题的bug 那是幂的意思,不是力量... POJ 3233 Matrix Power Series 描述 Given a n × n matrix A and a positive in ...
- Selenium Java 自动化 介绍及开发工具的使用(一)
前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要.本系列依然以selenium2为基础,目前selenium3本人没做过研 ...
- pc和移动端获取滚动条的位置
移动端获取滚动条:document.body.scrollTop pc端获取滚动条:document.documentElement.scrollTop
- Python-S9-Day101 Vue-cli
01 昨天内容回顾 02 音乐播放器计算属性方法和组件创建 03 Vue-cli项目生成 04 模板中组件的使用 01 昨天内容回顾 1.1 {{xxx}}模板语法,插值,简单的运算: 1.2 指令系 ...
- Mac: mac git 的安装 及实现自动补全
1.检查是否装了brew $ brew list 如果没有,拷贝以下命令到终端 回车.可以安装好brewruby -e "$(curl -fsSL https://raw.githubuse ...
- Leetcode 503.下一个更大元素
下一个更大元素 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你 ...
- JQuery向ashx提交中文参数方案 [转]
转自:http://blog.csdn.net/wangqiuyun/article/details/8450964 字符编码这个东西,一旦和中文打上交道就不可避免出现乱码,今天项目用到了JQuery ...
- C# Winform打包部署时添加注册表信息实现开机启动(转载)
使用VS自带的打包模块可以很方便的对项目进行打包部署,同时我们也可以在安装部署时操作注册表实现开机启动软件.具体实现如下: 1.添加安装部署项目后,鼠标右键安装项目->视图->注册表 ...
- ALPHA(五)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- layer 体验
做后端的,前端一直不擅长,提示语以前也只会alert,非常难看,后来在别人代码看到lay.msg() https://pan.baidu.com/s/1eRHH59g <!DOCTYPE htm ...