栈——longest-valid-parentheses(最长有效括号长度)

题目描述


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.

方法一:利用栈存储”(“的下标。

用一个bool数组来标记已经匹配过的字符,找到最长的连续标记的长度就是所求的结果。只要遍历两遍数组,时间复杂度为O(n)。

import java.util.*;
public class Solution {
    public int longestValidParentheses(String s) {
        if(s == null||s.length() < 2)
            return 0;
        Stack<Integer> stack=new Stack();
        boolean[] flag=new boolean[s.length()];
        char[] ch=s.toCharArray();
        for(int i=0;i<ch.length;i++)
            {
            if(ch[i] == '(')
                {
                stack.push(i);
            }
            else if(ch[i] == ')')
                {
                if(!stack.empty())
                    {
                    flag[stack.pop()]=true;//stack储存‘(’的下标;
                    flag[i]=true;
                }
            }
        }
        int count=0;
        int num=0;
        for(int i=0;i<flag.length;i++)
            {
            if(flag[i] == true)
                {
                count++;
                if(count>num)
                    {
                    num=count;
                }
            }
            else
                {
                count=0;
            }
        }
      return num;
    }
}



方法二:DP

dp[i]的值为以s.charAt(i)结尾的最长的有效括号子串长度。

import java.util.*;
public class Solution {
    public int longestValidParentheses(String s) {
        if(s == null||s.length() < 2)
            return 0;
       //dp[i]存放以s.charAt(i)结尾的最长的length
        int[] dp=new int[s.length()];
        for(int i=1;i<s.length();i++)
            {
            if(s.charAt(i) == '(')
                dp[i]=0;
            if(s.charAt(i) == ')')
                {
                int pre=i-dp[i-1]-1;
                if(pre>=0&&s.charAt(pre) == '(')
                    {
                    dp[i]=dp[i-1]+2+((pre-1>=0)?dp[pre-1]:0);
                }
            }
        }
        int max=0;
        for(int i=0;i<dp.length;i++)
            {
            if(dp[i] > max)
                max=dp[i];
        }
        return max;
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值