【LeetCode】32. Longest Valid Parentheses

Difficulty: Hard

 More:【目錄】LeetCode Java實現html

Description

https://leetcode.com/problems/longest-valid-parentheses/java

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.post

Example 1:ui

Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is 
"()"

Example 2:code

Input: ""
Output: 4
Explanation: The longest valid parentheses substring is )()())"()()"

Intuition

Method 1: Dynamic Programmingorm

  1. Define subLen[i] as the length of the longest valid parentheses subString which is end with char at index i (s[i]).htm

  2. If s[i]=='(', subLen[i]=0blog

      If s[i]==')'  ip

     If(s[i-subLen[i]-1]==')', subLen[i]=0 leetcode

       If(s[i-subLen[i]-1]=='(', subLen[i]=subLen[i-1]+2+subLen[i-subLen[i-1]-2]

 

Method 2: Using a stack to store the index of '(', and using 2 pointers to store left index and right index of a subString.

 

Solution

Method 1

    public int longestValidParentheses(String s) {
        if(s==null || s.length()<=0)
            return 0;
        int[] subLen = new int[s.length()];
        int maxLen=0;
        for(int i=1; i<s.length(); i++){
            if(s.charAt(i)==')'){
                int pre = i-subLen[i-1]-1;
                if(pre>=0 && s.charAt(pre)=='('){
                    subLen[i]=subLen[i-1]+2+(pre>0 ? subLen[pre-1] : 0);
                }
                maxLen=Math.max(maxLen,subLen[i]);
            }
        }
        return maxLen;
    }

  

Method 2

    public int longestValidParentheses(String s) {
        if(s==null || s.length()<=0)
            return 0;
        int maxLen=0;
        int left=-1;
        Stack<Integer> stk = new Stack<Integer>();
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i)=='(')
                stk.push(i);
            else{
                if(stk.isEmpty())
                    left=i;
                else{
                    stk.pop();
                    int len = stk.isEmpty() ? i-left : i-stk.peek();
                    maxLen=Math.max(len,maxLen);
                }
            }
        }
        return maxLen;
    }

  

  

Complexity

Time complexity : O(n)

Space complexity :  O(n)

 

 More:【目錄】LeetCode Java實現

相關文章
相關標籤/搜索