32. Longest Valid Parentheses

题目:32. 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 "()()"

题意解析:

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

解题思路一:栈

利用java的栈。首先定义两个栈一个用来存储括号字符,一个用来存储对应的下标。循环遍历每个括号,当遇到"("时,将其进行入栈操作;当遇到")"时,这是我们需要进行判断:

1.当栈顶元素是"("时这是两个栈都进行出栈操作,并记录下当前最长的有效括号,此时如果栈2的size为0则明显到目前为止全部是有效的括号。则最大值为i+1,否则此时最大值就为i-t2.peek(),即从最近的一个不是有效的括号到目前的所有有效括号的长度。

2.当栈顶元素是")"时继续进行入栈操作即可。

public int longestValidParentheses(String s) {
        int len=s.length();
        int max=0;
        Stack t1 = new Stack();
        Stack t2 = new Stack();
        for(int i=0;i0 && t1.peek().equals('(')){
                    t1.pop();
                    t2.pop();
                    int tmp=t2.size()==0?i+1:i-t2.peek();
                    max=Math.max(max,tmp);
                }
                else{
                    t1.push(')');
                    t2.push(i);
                }
            }
        }
        return max;
    }

提交代码之后:

Runtime: 10 ms, faster than 27.84% of Java online submissions for Longest Valid Parentheses.

Memory Usage: 35.1 MB, less than 99.98% of Java online submissions for Longest Valid Parentheses.

可见效率并不是很高。

解题思路二:动态规划

使用一个int类型的数组来保存数据,遇到")"时就进行判断,当i的前一个字符即s.charAt(i-1)="("时,这是只需让当前dp[i]=dp[i-2]+2即可,当i<2时,dp[i]=2;如果s.charAt(i-1)不为(,此时如果i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(',这时是形如(())这样的括号包括号的结构,我们就需要让dp[i]的值等于dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2即可。

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

提交代码之后:

Runtime: 1 ms, faster than 100.00% of Java online submissions for Longest Valid Parentheses.

Memory Usage: 37 MB, less than 99.80% of Java online submissions for Longest Valid Parentheses.

你可能感兴趣的:(LeetCode)