[leetcode] Longest Valid Parentheses


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.

tag: dynamic programming

一开始我用了一些奇技淫巧,结果最坏情况是n^2,没有通过。

考虑动态规划。设置一个长度为s.size()的动态规划数组dp[]。

dp[i]表示从0-i里包括s[i]的合法字符串的最大长度;

对于i = i + 1, 如果s[i] == ‘(‘, dp[i] = 0;

如果s[i] == ‘)’, 检查最大匹配字符串之前的那个符号,即prev = i – dp[i-1] – 1;(如果prev<0;dp[i] = 0)

如果s[prev] == ‘)’,dp[i] = 0;

如果s[prev] == ‘(‘, dp[i] = dp[i-1] + 2 + dp[prev-1];(如果prev-1>=0的话),这里我们是把两个合法字符串拼接起来。

class Solution {
public:
    int longestValidParentheses(string s) {
        int size = s.size();
        int dp[size];// dp[i] 表示从0到i的包括s[i]的最长字符匹配的长度
        int max = 0;
        dp[0] = 0;
        for(int i = 1; i < size; i++){
            if(s[i] == '('){
                dp[i] = 0;
            }
            else{
                int prev = i - dp[i - 1] - 1;
                if(prev >= 0 && s[prev] == '('){
                    dp[i] = dp[i - 1] + 2;
                    if(prev - 1 >= 0){
                        dp[i] += dp[prev - 1];
                    }
                }
                else{
                    dp[i] = 0;
                }
            }
            if(dp[i] > max){
                max = dp[i];
            }
        }
        return max;
    }
};

Untitled

 

 

Leave a comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.