Longest Valid Parentheses

来源:互联网 发布:雷电网络众筹 编辑:程序博客网 时间:2024/05/16 16:11

总结三种方法。

方法一,参考http://www.cnblogs.com/lichen782/p/leetcode_Longest_Valid_Parentheses.html 的解法二。

使用栈来保存左括号的Index,遇到左括号则进站。遇到右括号,如果当前栈为空,则表明当前index是一个无法匹配的“ )”,用last标记;如果当前栈不为空,则出栈。

出栈后如果当前栈为空,则从last到index是一个完整的匹配,更新最大长度,如果当前栈不为空,则当前valid序列长度为index-stack.top,尽管该序列可能继续增长。

时间复杂度O(n),空间复杂度O(n)。

代码如下:

class Solution {public:    int longestValidParentheses(string s) {                const int n = s.size();                stack<int> lefts;        int start = -1;        int max_len = 0;                for(int i=0; i<n; ++i)        {            if(s[i] == '(')                lefts.push(i);            else            {                if(lefts.empty())                 {                    //no left match, an invalid pos                    start = i;                }                else                {                    //find a matching pair                    lefts.pop();                    if(lefts.empty())                    {                        //有一个完整的valid的group。计算该group的长度                        max_len = max(max_len, i-start);                     }                    else                    {                        //栈内还有‘(',一个最外层完整的group还没有匹配完成,                        //但是通过查询下一个即将匹配还未匹配的"("的index来更新maxLen。                        max_len = max(max_len, i-lefts.top());//the last un-matched '('                    }                }            }        }                return max_len;    }};

方法二,使用一维动态规划

参考 http://blog.csdn.net/abcbc/article/details/8826782

时间复杂度O(n),空间复杂度O(n)。

代码如下:

class Solution {public:    int longestValidParentheses(string s) {        const int len = s.size();        if(len == 0)    return 0;                int max_len = 0;        vector<int> length(len, 0);                for(int i=1; i<len; i++)        {            int match = i - length[i-1] - 1;            if(match >=0 && s[match] == '(' && s[i] == ')')            {                length[i] = length[i-1] + 2;                if(match >= 1)                    length[i] = length[i] + length[match-1];                max_len = std::max(max_len, length[i]);            }        }        return max_len;    }};



0 0