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的对,最大的即为结果。
本文探讨了如何寻找字符串中最长的有效括号子串的方法,包括两种算法:一种是简单的暴力搜索,时间复杂度为O(n^2);另一种是采用动态规划方法,将时间复杂度降低至O(n)。

60

被折叠的 条评论
为什么被折叠?



