问题:给定一个只含左括号和右括号的字符串,找最长匹配的括号子串的长度;
如:():2,((():2,(()):4,()():4
解法:记开始匹配位置star=-1,最长匹配长度maxn=0,考察第i位字符c;
如果c为左括号,压栈;如果c为右括号,他一定与栈顶左括号匹配;
a.如果栈为空,表示没有匹配的左括号,star=i,为下一次可能的匹配做准备。
b.如果栈不为空,出栈
1.如果栈为空,i-start即为当前找到的匹配长度,检查i-star是否比maxn大,大则更新;
2.如果栈不空,则当前栈顶元素t是上次匹配的最后位置,检查i-t是否比maxn大,大则更新;
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
while(cin>>str)
{
stack<int>pq;
int len=str.size(),star=-1,maxn=0;
for(int i=0;i<len;i++)
{
if(str[i]=='(')
pq.push(i);
else
{
if(!pq.empty())
{
pq.pop();
if(!pq.empty())
maxn=max(maxn,pq.top()-star);
else
maxn=max(maxn,i-star);
}
else
star=i;
}
}
printf("%d\n",maxn);
}
return 0;
}