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.

 

该题使用动态规划思想

我首先想到的是利用一个二维数组来保存长度,二维数组的x,y为字符串下标,保存它们之间的子字符串的长度。

但是我无法找到一种简单的公式来表示大问题和小问题之间的关系,这种关系相当复杂,我找出了36种情况,并想一一列出,但发现36种之外还有其他情况。结果我就放弃了这种方法。

于是我到网上搜索了其他人的算法,发现居然只用一维数组就可以解决

这个一维数组的值含义是表示从s[i]到s[s.length - 1]包含s[i]的最长的有效匹配括号子串长度

说实话,这个含义并不容易想得到,如果我来思考的话,我首先想到不包含s[i]的最长有效匹配括号字串。是基于什么样的思路才得到这样的结果。为什么我就想不出来呢?我不相信是我的智商问题,一定是我做的题太少了。继续刷题吧,量变总会有质变的那一天。

int longestValidParentheses(string s) {
    int len = s.size();
    if(len < 2)
        return 0;
    int maxLen = 0;
    int f[len];
    for(int i = 0; i < len; ++i) // 初始化为0
        f[i] = 0;

    for(int i = len-2; i >= 0; --i)
    {
        if(s[i] == '(') // 既然是包含s[i],那么s[i]必然是'('才能构成匹配括号
        {
            int j = i + 1 + f[i+1]; // 下一个"也许"不能匹配的括号的位置
            if(j < len && s[j] == ')') // 这个"也许"经检查可以匹配
            {
                f[i] = f[i+1] + 2;
                if(j + 1 < len) // 当心如果后面还有匹配的括号的话长度要加上
                    f[i] += f[j+1];
            }
            if(f[i] > maxLen) // 最大长度
                maxLen = f[i];
        }        
    }
    return maxLen;
}

 

posted @ 2015-08-05 10:28  sdlwlxf  阅读(132)  评论(0编辑  收藏  举报