longest-valid-parentheses

来源:互联网 发布:js是哪里的车牌 编辑:程序博客网 时间:2024/06/01 09:50

题目:

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 ans=0,last=-1;        stack<int> st;        for(int i=0;i<s.size();i++){            if(s[i]=='(') st.push(i);//存储技巧,存储的是坐标而不是括号            else{                 if(!st.size()) last=i;                 else{                    st.pop();                    if(st.size()) ans=max(ans,i-st.top());                    else ans=max(ans,i-last);                 }            }        }        return ans;    }};

方法二:

动态规划,反向判断

class Solution {public:    int longestValidParentheses(string s) {        int i,j,n;          int dp[65536];          int max=0;          n=s.size();          for(i=0;i<65536;i++)              dp[i]=0;          for(i=n-2;i>=0;i--)          {              if(s[i]=='(')              {                  j=i+1+dp[i+1];                  if(j<n && s[j]==')')                  {                      dp[i]=dp[i+1]+2;                      if(j+1<n)                          dp[i]+=dp[j+1];                  }              }              if(max<=dp[i])                  max=dp[i];          }          return max;          }};

点评:

此题无法使用常规的字符串解法,会超时,一般需要用到栈,此题可采用一维动态规划,反向解题