您的位置:首页 > 其它

LeetCode (32) Longest Valid Parentheses

2015-09-28 14:19 363 查看

题目

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.

分析

思路参考

这道题可以用一维动态规划逆向求解。

假设输入括号表达式为String s,维护一个长度为s.length的一维数组dp[],数组元素初始化为0。 dp[i]表示从s[i]到s[s.length - 1]包含s[i]的最长的有效匹配括号子串长度。

则存在如下关系:

dp[s.length - 1] = 0;

i从n - 2 -> 0逆向求dp[],并记录其最大值。

若s[i] == ‘(‘,则在s中从i开始到s.length - 1计算dp[i]的值。这个计算分为两步,通过dp[i + 1]进行的(注意dp[i + 1]已经在上一步求解):

在ss中寻找从i+1i + 1开始的有效括号匹配子串长度,即dp[i+1]dp[i + 1],跳过这段有效的括号子串,查看下一个字符,其下标为j=i+1+dp[i+1]j = i +1 + dp[i + 1]。若jj没有越界,并且s[j]==‘)′s[j] == ‘)’,则s[i...j]s[i ... j]为有效括号匹配,dp[i]=dp[i+1]+2dp[i] =dp[i +1] + 2。

在求得了s[i...j]s[i ... j]的有效匹配长度之后,若j+1j + 1没有越界,则dp[i]dp[i]的值还要加上从j+1j + 1开始的最长有效匹配,即dp[j+1]dp[j + 1]。

AC代码

class Solution {
public:
int longestValidParentheses(string s) {
if (s.empty())
return 0;

//求括号字符串长度
int len = s.length();

//定义一个长度vector,i处值计量从i开始的到len-1长度字符串的最长有效匹配括号长度
vector<int> dp(len, 0);
int maxlen = 0;

for (int i = len - 2; i >= 0; --i)
{
if (s[i] == '(')
{
int j = i + 1 + dp[i + 1];
if (j < len && s[j] == ')')
{
dp[i] = dp[i + 1] + 2;
if (j + 1 < len)
dp[i] += dp[j + 1];
}
}

//实时求最长有效匹配长度
if (dp[i] > maxlen)
maxlen = dp[i];
}//for
return maxlen;
}
};


GitHub测试程序源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: