BIT2014级软件学院程序设计-21括号序列
2016-03-02 16:12
211 查看
题目描述:
一个括号序列是指一个由'(', ')', '[', ']'四种字符组成的字符串。
一个只包含数字,加号'+',和上述四种括号的合法算数表达式,去掉数字和加号之后得到的括号序列成为合法的括号序列。我们定义空串也是合法的括号序列。
例如(1) + [2], ([3]), 4 + [5]相应的括号序列 "()[]", "([])", "[]"都是合法的括号序列。而(6 + 7], [8 + ((9对应的"(]", "[(("则是非法的。
字符串s0s1s2⋯s|s|−1的子串s[l,r](0≤ l≤r<|s|)是指slsl+1⋯sr。
现在给定一个括号序列,请找出其中的一个子串,使得这个子串是合法的括号序列,且包含的'['数量最多。
输入:
一个括号序列s。1≤|s|≤5×100000
输出:
第一行,答案要求的子串中包含'['的数量。
如果答案是0,输出到此为止,否则:
第二行,两个整数l, r。表示子串第一个字符的位置和最后一个字符的位置。
如果有多个满足条件的字符串,请输出使得子串长度最大的答案。如果长度最大的仍有多个,请输出r最大的。
样例:
input:
([])
output:
1
0 3
用栈的思想。先入后出。用一个数组来模拟栈。然后就是一些细节的处理。
一个括号序列是指一个由'(', ')', '[', ']'四种字符组成的字符串。
一个只包含数字,加号'+',和上述四种括号的合法算数表达式,去掉数字和加号之后得到的括号序列成为合法的括号序列。我们定义空串也是合法的括号序列。
例如(1) + [2], ([3]), 4 + [5]相应的括号序列 "()[]", "([])", "[]"都是合法的括号序列。而(6 + 7], [8 + ((9对应的"(]", "[(("则是非法的。
字符串s0s1s2⋯s|s|−1的子串s[l,r](0≤ l≤r<|s|)是指slsl+1⋯sr。
现在给定一个括号序列,请找出其中的一个子串,使得这个子串是合法的括号序列,且包含的'['数量最多。
输入:
一个括号序列s。1≤|s|≤5×100000
输出:
第一行,答案要求的子串中包含'['的数量。
如果答案是0,输出到此为止,否则:
第二行,两个整数l, r。表示子串第一个字符的位置和最后一个字符的位置。
如果有多个满足条件的字符串,请输出使得子串长度最大的答案。如果长度最大的仍有多个,请输出r最大的。
样例:
input:
([])
output:
1
0 3
用栈的思想。先入后出。用一个数组来模拟栈。然后就是一些细节的处理。
#pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 500005 char ch[maxn]; typedef struct { int pos; char cc; }NODE; NODE stack[maxn]; typedef struct { int left, right, leng; }ANS; ANS ans; int top=0; int l, r, le; void push(int k, char c) { top++; stack[top].pos = k; stack[top].cc = c; } void pull(int k,char c) { if (top > 0) { if (stack[top].cc != c) { top = 0; l = maxn;r = 0;le = 0; } else { if (stack[top].pos < l) l = stack[top].pos; r = k; if (c == '[') le++; top--; if( (le > ans.leng || (le == ans.leng&&r - l > ans.right - ans.left))&&stack[top].pos<=l) { ans.left = l;ans.leng = le; ans.right = r; } } } else { top = 0; l = maxn;r = 0;le = 0; } } void pull1(int k,char c) { if (top > 0) { if (stack[top].cc != c) { top = 0; l = 0;r = 0;le = 0; } else { if (stack[top].pos > r) r = stack[top].pos; l = k; if (c == ']') le++; top--; if( (le > ans.leng || (le == ans.leng&&r - l > ans.right - ans.left))&&stack[top].pos>=r&&stack[top].pos>=r) { ans.left = l;ans.leng = le; ans.right = r; } } } else { top = 0; l = maxn;r = 0;le = 0; } } int main() { //freopen("E:in.txt","r",stdin); //freopen("E:outt.txt","w",stdout); int i; int len; while( scanf("%s", ch)!=EOF){ len = strlen(ch); ans.left = maxn;ans.right = 0;ans.leng = 0; top=0; l=maxn;r=0;le=0; stack[0].pos=maxn; for (i = len-1;i >= 0;i--) { if (ch[i] == ']'||ch[i]==')') { push(i,ch[i]); } if (ch[i] == '[') { pull1(i,']'); } if (ch[i] == '(') pull1(i, ')'); } l=maxn;r=0;le=0; top=0;stack[0].pos=0; for (i = 0;i < len;i++) { if (ch[i] == '['||ch[i]=='(') { push(i,ch[i]); } if (ch[i] == ']') { pull(i,'['); } if (ch[i] == ')') pull(i, '('); } printf("%d\n", ans.leng); if (ans.leng) printf("%d %d\n", ans.left, ans.right); } }
相关文章推荐
- Android应用开发经典面试题
- c#实现ping
- 0302软件构建与教学
- Mvc Autofac构造器注入
- 3.2 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
- Fedora 启动sshd服务:
- bash shell --数据流重导向
- Java代码规范
- 计算机网络知识整理
- 自动加锁
- Spring定时任务的几种实现
- hdu--5510
- Ubuntu12.04下录屏并且转换成Gif
- IOS-56-UIWebview浏览器中自定义底部导航栏透明效果的实现
- Android Studio运行项目报错
- Myeclipse安装使用MAVEN
- iOS开发小记:iOS富文本框架DTCoreText在UITableView上的使用
- 软件设计的不同模型:瀑布式、快速原型法以及迭代式
- Ansible安装配置
- 你必须知道的.NET