您的位置:首页 > 其它

Leetcode:Longest Valid Parentheses

2013-10-22 11:32 190 查看
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.

class Solution                                                                                                                                               
{
public:
    /*int longestValidParentheses(string s)
    {
        int maxlen = 0;
        for(int i=0; i<s.size(); ++i)
        {
            int len = maxlenbeginwith(s.substr(i) );    
            if(maxlen < len)
                maxlen = len;
        }
        return maxlen;
    }
    int maxlenbeginwith(string s)
    {
        int sum = 0,len = 0;    
        for(int i=0; i<s.size(); ++i)
        {
            if(s[i]==')')
            {
                sum--;  
            }
            else
                ++sum;
            if(sum < 0)
                return len;
            if(sum == 0)
                len = i+1;
                
        }
        return len;
    }*/
    int longestValidParentheses(string s)
    {
        /*if(s.empty())
            return 0;*/
        int* dp = new int[s.size()];
        memset(dp,0,sizeof(int)*s.size() );
        int maxlen = 0;
        for(int i=1;i<s.size(); ++i)
        {
            if(s[i]==')')
            {
                if(i-dp[i-1]-1>=0 && s[i-dp[i-1]-1]=='(')
                {
                    dp[i] = dp[i-1]+2;  
                    if(i-dp[i-1]-2>=0)
                        dp[i] += dp[i-dp[i-1]-2];
                    if(maxlen < dp[i])
                        maxlen = dp[i];
                }
            }
        }
        delete [] dp;
        return maxlen;
    }
};


1.第一种暴力的O(n^2)大数据超时

2.动态规划O(n),dp[i]表示以i为结尾的最长配对括号数,注意这里有括号左右顺序限制。如果是正负数个数相同问题,此方法是错误的。

扩展:求最长字串长度,字串中正负数个数相同?

1.暴力,以i为开始的。正数+1,负数-1,记录为0的位置,最后一个为0的位置-i即为该次的最长。遍历串,O(n^2)

2.O(n)怎么做?辅助数组记录从0开始到当前位置正数个数-负数个数,然后针对辅助数组分析,L[j]==L[i]说明[i+1,j]区间正数负数个数相等,j-i即为以j为结尾的长度,扫一遍辅助数组,使用hash记录L[i]和i的对,最大的即为结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: