码迷,mamicode.com
首页 > 其他好文 > 详细

32. Longest Valid Parentheses

时间:2016-05-07 23:49:55      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

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.

给出一个只包含‘(‘和‘)‘字符的字符串,找到最长的合法子串。

主要题目要找的子串而不是子序列,所以思路是利用双指针,I指向开始,J指向结尾,变量cnt 等于I,J之间 ’(‘的字符个数 - ‘)‘的字符个数。

分三种情况:1.当 cnt<0 时J之前的字符都不用考虑,I = J+1, J = I;2.当 cnt = 0是这是I,J之间的字符是合法的,要更新最长长度;3.当 cnt > 0 继续往后迭代J。

这样处理完了之后如果 cnt > 0 说明右边还有一段没有妥善处理,这时候要从右边开始重新做类似的处理,而为了函数复用,可以将右边剩余的子串做一下反转,然后再调用相同的函数即可。因为每个字符最多只需要考虑两次,所以时间复杂度是O(N),N是输入字符串的长度,给出代码如下:

int longp(string s, string& rst);
void convert(string& s);

int longestValidParentheses(string s) 
    string rst;
    int mx = longp(s, rst);
    if (!rst.empty())
    {
        convert(rst);
        mx = max(mx, longp(rst, rst));
    }
    return mx;
}

int longp(string s, string& rst)
{
    int n = s.size();
    int mx = 0;
    int cnt = 0;
    int i=0;
    for(int j=0; j<n; ++j)
    {
        if (( == s[j])
            ++cnt;
        else --cnt;
        if (cnt < 0)
        {
            cnt = 0;
            i = j+1;
        }
        else if (0==cnt)
            mx = max(mx, j-i+1);
    }
    if (cnt > 0)
        rst = s.substr(i);
    return mx;
}

void convert(string& s)
{
    reverse(s.begin(), s.end());
    for (int i=0; i<s.size(); ++i)
        if (( == s[i])
            s[i] = );
        else s[i] = (;
}

 

32. Longest Valid Parentheses

标签:

原文地址:http://www.cnblogs.com/zhiguoxu/p/5469394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!