zoj 2704 Brackets 用栈维护括号匹配 (8-A)
题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2704
题解: 1 看见括号匹配自然想到用栈去匹配,但是这里想记录最大长度,想法就是每次匹配以后还要知道匹配的括号在原来的序列中的下标,这样把括号存在结构体里最好了。
2 得到了匹配的序列以后,求最大的连续的“1”序列, 记得在最后面加上一个0,否则可能漏掉最后一段连续的“1”。
3输出子序列时,由于有可能完全没有匹配的,于是还设置一个bool non,如果没有一个“1”就直接输出空串。
#include<iostream> #include<stack> #include<string> using namespace std; struct bracket { int id; char ch; }; int main() { string s; while(cin>>s) { int size=s.length(); bracket * p=new bracket[size]; for(int i=0;i<size;i++) { p[i].ch=s[i]; p[i].id=i; } stack<bracket> st; int * ismatch=new int [size+1]; for(int i=0;i<size;i++) ismatch[i]=0; for(int i=0;i<size;i++) { if(st.empty()==true) st.push(p[i]); else { if(st.top().ch=='('&&p[i].ch==')' || st.top().ch=='['&&p[i].ch==']') { ismatch[st.top().id]=1; ismatch[i]=1; st.pop(); } else st.push(p[i]); } } int maxlength=0; int count=0; int end=0; bool non=true; ismatch[size]=0; // 处理最后一位是1的情况 for(int i=0;i<size+1;i++) { if(ismatch[i]==1) { count++; non=false; } else { if(count>maxlength) { maxlength=count; end=i-1; } count=0; } } if(non==false) cout<<s.substr(end-maxlength+1,maxlength)<<endl; else cout<<endl; cout<<endl; } }