zoukankan      html  css  js  c++  java
  • leetcode32 Longest Valid Parentheses 最长有效括号序列

    题目:

    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)栈模拟

    分各种情况:

    有些串比如

    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;
        }
  • 相关阅读:
    移动端屏幕适配解决方案
    ES6学习笔记(1)——模块化
    弹性盒布局学习总结
    阮一峰之webpack-demos(译)
    阮一峰的Git分支管理策略之学习总结
    移动端测试之服务器搭建
    webApp 移动Touch框架
    Javascript 严格模式详解
    caller和callee的区别
    avalon 中require.config源码分析
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7630123.html
Copyright © 2011-2022 走看看