zzulioj--10465--最长匹配子串(栈模拟)
2016-04-13 21:39
357 查看
10456: 最长匹配子串
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 133 Solved: 27
[Submit][Status][Web
Board]
Description
定义一个满足括号匹配的字符串为完美串。一个由'(',')'组成的字符串,怎么才能求出来字符串S中最长的完美串(S的子串)的长度呢?
Input
输入的第一行是一个数字k,代表输入的样例组数(k < 100)。每组样例是一个字符串只由'(',')'这两个字符组成的字符串s(|s| < 100000)。
Output
输出s中最长的匹配子串的长度。
Sample Input
3 ()() ((()) (
Sample Output
4 4 0
思路:因为是要找连续的括号配对,如果我们知道最长的括号配对序列的两个端点的坐标的话我们就可以找出最长的长度,这里我用两个栈模拟括号配对,括号进栈的同时我们记录他的坐标,括号出栈的时候对应的数字栈也一并出栈,这样的话最后栈里剩下的括号跟数字栈中的数字是对应的,这些括号是不能配对的,但是他们两侧的括号是可以完成配对的,模拟有点坑,需要加一些小技巧还有判断
#include<cstdio> #include<cstring> #include<cmath> #include<stack> #include<algorithm> using namespace std; char str[100000]; stack<char>q; stack<int>p; int main() { int t; scanf("%d",&t); getchar(); while(t--) { memset(str,0,sizeof(str)); while(!q.empty()) q.pop(); while(!p.empty()) p.pop(); scanf("%s",str); int l=strlen(str); p.push(1); for(int i=0;i<l;i++) { if(q.empty()) { q.push(str[i]); p.push(i+1); continue; } if(str[i]==')') { char ch=q.top(); if(ch=='(') { q.pop(); p.pop(); } else if(ch==')'||q.empty()) { q.push(str[i]); p.push(i+1); } } else { q.push(str[i]); p.push(i+1); } } p.push(l); int pre,now; if(q.empty()) printf("%d\n",l); else { now=p.top(); p.pop(); int maxx=0; while(!p.empty()) { pre=p.top(); p.pop(); int s=now-pre; if(s==1) s=0; maxx=max(maxx,s); now=pre; } if(maxx&1) maxx-=1; printf("%d\n",maxx); } } return 0; }
相关文章推荐
- 第三次C++作业
- Android 5.0 Intercept HomeKey
- 离散数学 Resolution 消解算法
- 【c语言】用选择法对10个整数排序
- 招商银行信用卡中心(信息技术部)暑期实习笔试题
- Hibernate的一级和二级缓存
- 【c语言】输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如:1990->1 9 9 0
- 使用Sass优雅并高效的实现CSS中的垂直水平居中(附带Flex布局,CSS3+SASS完美版)
- LINUX+Vmware+SVN的配置和安装
- Yaml学习笔录
- 《Linux内核分析》第八周:进程的切换和系统的一般执行过程
- 西普实验吧-ctf-web-1
- 20135220谈愈敏Blog8_进程的切换和系统的一般执行过程
- 读《杀人之门》
- PHP_CodeSniffer的下载和使用
- 操作系统
- GDB的基本使用
- iOS APP上架流程(详细)
- c语言:实现奇数阶魔方阵
- leetcode——18——4Sum