题目地址: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;
}
}