zoukankan      html  css  js  c++  java
  • 【LeetCode】32. Longest Valid Parentheses

    Difficulty: Hard

     More:【目录】LeetCode Java实现

    Description

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

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

    Example 1:

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

    Example 2:

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

    Intuition

    Method 1: Dynamic Programming

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

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

          If s[i]==')'  

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

           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实现

  • 相关阅读:
    针式PKM使用经验一:日期视图
    针式PKM使用经验二:分类的显示顺序
    pythonunittest(6)
    pythonunittest(9)
    pythonunittest(10)
    wxpython学习笔记(1)
    利用正则表达式进行修改自定义ini配置文件
    pythonunittest(7)
    使用loadrunner进行服务器性能测试(winsocket)
    pythonunittest(8)
  • 原文地址:https://www.cnblogs.com/yongh/p/11605247.html
Copyright © 2011-2022 走看看