最长括号匹配(栈)
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大,大则更新;
如:():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; }
相关文章推荐
- Longest Valid Parentheses (求最长有效匹配括号子串的长度)
- 第32题 最长匹配括号
- 最长括号匹配问题
- 【LeetCode】最长括号匹配Longest Valid Parentheses
- 最长括号匹配长度
- [LeetCode]—Longest Valid Parentheses 最长括号匹配
- 正确匹配的最长的括号子串
- Longest Valid Parentheses (求最长有效匹配括号子串的长度)
- 求最长有效匹配括号子串的长度(Longest Valid Parentheses)
- LeetCode | 32. Longest Valid Parentheses——最长有效括号匹配长度
- 32.最长的合法括号匹配
- [luoguP1944] 最长括号匹配_NOI导刊2009提高(1)
- 栈的应用之最长匹配括号长度
- 51nod 1478 括号序列的最长合法子段(栈-括号匹配寻找最长合法子串长度及其个数)
- LeetCode | Longest Valid Parentheses(最长有效的括号匹配)
- [C++]连续最长括号匹配问题解决策略二(学习)
- 最长的含有相同数目的01子串 & 括号匹配问题
- 洛谷 P1944 最长括号匹配_NOI导刊2009提高(1)
- LeetCode-Longest Valid Parentheses-最长匹配括号-栈的应用
- Longest Valid Parentheses:最长括号子段匹配