题目描述
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.
Subscribe to see which companies asked this question
Show Tags
Show Similar Problems
题目解析
从给定字符串中找出最长的合法串的长度。
开始时我的思路错了,用的逻辑如下:
c[i][j]代表以i,j为两端的子串是否为合法串。下标从0开始,类Python的切片规则。
c[i][j] = s[i]==’(’ && s[j-1]==’)’ && c[i+1][j-1];
or c[i][j] = c[i][k]*c[k][j];
以字符串长度为主序循环,不过这样的时间复杂度到了O(n^3),超时。
看了别人O(n)时间复杂度的方法,逻辑如下:
以s[i]为结尾的最长合法串长度longest[i];
if s[i]==’(’ then longest[i] = 0;
if s[i]==’)’ && s[i-1]==’(’ then longest[i]=longest[i-2]+2;
if s[i]==’)’ && s[i-longest[i-1]-1]==’(’ then longest[i]=longest[i-1]+2;
longest[i]+=longest[i-longest[i]];
代码
class Solution {
public:
int longestValidParentheses(string s) {
int m=s.size(),ans=0;
if(m==0)
{
return 0;
}
vector<vector<bool> >c(m+1,vector<bool>(m+1,false));
for(int i=0;i<=m;i++)
{
c[i][i]=true;
}
for(int len=2;len<=m;len+=2)
{
for(int i=0;i+len<=m;i++)
{
if(s[i]=='('&&s[i+len-1]==')'&&c[i+1][i+len-1])
{
c[i][i+len]=true;
ans=len;
continue;
}
int k=i+2;
while(k<i+len)
{
if(c[i][k])
{
break;
}
k+=2;
}
if(k<i+len&&c[k][i+len])
{
c[i][i+len]=true;
ans=len;
}
}
}
return ans;
}
};