LeetCode 32. Longest Valid Parentheses(hard)

来源:互联网 发布:优惠券制作软件 编辑:程序博客网 时间:2024/06/11 04:35

题目描述

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;    }};
0 0