标签:bst sub 括号配对 uri txt 遇到 top 时间 第一个
题目:
Given a string containing just the characters ‘(‘
and ‘)‘
, find the length of the longest valid (well-formed) parentheses substring.
For "(()"
, the longest valid parentheses substring is "()"
, which has length = 2.
Another example is ")()())"
, where the longest valid parentheses substring is "()()"
, which has length = 4.
与之前NYoj上的基础括号匹配和补括号dp两个都不太一样,需要一种新的思路吧,leetcode的有些题意都说的不清楚,只说最长有效括号,样例给的情况不全,有点争议。
参考样例:
())()
())(()
))()())
反正最后的情况来看就是求最长的括号匹配序列的长度,中间有一个废括号隔开就算两个串。
解决方法:1)栈模拟 2)DP
分各种情况:
有些串比如
1.())(()() 结果为4
2. )()(()())结果为8,从第二个开始到结束都为“有效”的括号串,这里的有效就是在NYoj那道栈括号匹配基础题输出YES的一样。
然后就是用用栈模拟各种情况,这里用栈维护左括号的下标,遇到右括号就判断。如果遇到被割断的位置,因为右括号不会进栈,那么这里要用个lastPos记录这个位置,我觉得隔断肯定是),如果有多个(,取最上面的一个左括号的位置即可,刚好满足栈的性质。
eg:
())(((((()()(
到第一个右括号,但是右括号不会进栈,lastPos先是指到3,然后后面左括号无限进栈,碰到右括号了弹出最上面的左括号,如果此时空了,说明新串长度为pos-lastPos+1,这是为了统计(()())的情况,如果不为空,说明多个(,取top,pos-sta.top即可。
()())((()))
如果是这个,新串开始,栈进入三个左括号,遇到第一个右括号,弹出第一个左括号,更新非空下的Max,当前POS-top,继续右括号,弹出左括号,继续更新POS-top,第三个右括号,此时弹出左括号,栈空,当前POS+1-LastPos。遍历完毕return。O(n)时间复杂度。
#include <bits/stdc++.h> using namespace std; int main() { freopen("in.txt","r",stdin); string s; cin>>s; stack<int> sta; int Max=0; int lastPos=0; for (int pos=0; pos<s.length(); pos++) { if (s[pos]==‘(‘) //遇到左括号,直接存入。 sta.push(pos); else { //遇到右括号,分情况讨论 if (sta.empty()) //如果此时栈里左括号已经被消耗完了,没有额外的左括号用来配对当前的右括号了,那么当前的右括号就被单出来了,表明当前子串可以结束了,此时的右括号也成为了下一个group的分界点,此时右括号下标为index,所以下一个group的起始点为index+1,相当于skip掉当前的右括号。 lastPos=pos+1; else { //如果此时栈不空,可能有两种情况,1)栈正好剩下1个左括号和当前右括号配对 2)栈剩下不止1个左括号, sta.pop(); if (sta.empty()) //栈pop()之前正好剩下1个左括号,pop()之后,栈空了,此时group长度为pos-lastPos Max=max(Max, pos-lastPos+1); else //栈有pop()之前剩下不止1个左括号,此时额外多出的左括号使得新的group形成。如()(()())中index=4时,stack中有2个左括号 Max=max(Max, pos-sta.top()); } } } cout<<Max; }
leetcode32 Longest Valid Parentheses 最长有效括号序列
标签:bst sub 括号配对 uri txt 遇到 top 时间 第一个
原文地址:http://www.cnblogs.com/zhangmingzhao/p/7630123.html