您的位置:首页 > 其它

最长括号匹配(栈)

2016-07-29 10:33 106 查看
问题:给定一个只含左括号和右括号的字符串,找最长匹配的括号子串的长度;

如:():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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: