LeetCode 32:最长有效括号

最长有效括号

题目描述

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

示例1:

输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"

示例2:

输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

思路

思路1 DP + Stack

存在括号匹配可用栈进行存储,寻找满足括号对的存在,但是在本题中光有匹配的数目是不够的,需要从整体上计算匹配上的括号数目,且存在括号包含和括号不包含两种情况,如果非包含关系的话可以使用DP思想将匹配好的为止进行存储

思路2 Stack

其实与思路1类似可以直接只是用栈作为容器完成程序,主要在于满足匹配的最长子串的”)”开始索引,然后使用最后匹配的”)”进行位置计算,“(”和中间”)”全部pop,注意的关键点在于初始化栈是将-1引入为第一个元素,充当于”)”

代码

源文件

DP + Stack

  • Java
public class Solution {
    public int longestValidParentheses(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        int[] dps = new int[s.length()];
        int matchIndex = 0;
        int curLength = 0;
        int result = 0;
        Stack<Integer> stack = new Stack<>();
        for(int i = 0; i < s.length(); i++) &#123;
            char newChar = s.charAt(i);
            if (newChar == '(') &#123;
                stack.push(i);
            &#125;
            else&#123;
                if (!stack.isEmpty()) &#123;
                    matchIndex = stack.pop();
                    curLength = i - matchIndex + 1;
                    if (matchIndex - 1 > 0) &#123;
                        curLength += dps[matchIndex - 1];
                    &#125;
                    dps[i] = curLength;
                    if (curLength > result) &#123;
                        result = curLength;
                    &#125;
                &#125;
            &#125;
        &#125;
        return result;
    &#125;
&#125;
  • Python
class Solution:
    def longestValidParentheses(self, s: str) -> int:
        dp = [0, ] * len(s)
        result = 0
        cache = []
        for i in range(0, len(s)):
            cur_char = s[i]
            if cur_char == '(':
                cache.append(i)
            else:
                if len(cache) == 0:
                    continue
                else:
                    match_index = cache.pop()
                    cur_len = i - match_index + 1
                    if match_index - 1 > 0:
                        cur_len += dp[match_index - 1]
                    dp[i] = cur_len
                    if cur_len > result:
                        result = cur_len
        return result

Stack

  • Java
public class Solution2 {
    public int longestValidParentheses(String s) {
        if (s == null || s.length() < 2) {
            return 0;
        }
        Stack stack = new Stack<>();
        stack.push(-1);
        int result = 0;
        int tmp = 0;
        for (int i = 0; i < s.length(); i ++) {
            if (s.charAt(i) == '(') {
                stack.push(i);
            } else {
                stack.pop();
                if (stack.isEmpty()) {
                    stack.push(i);
                } else {
                    tmp = i - stack.peek();
                    result = result > tmp ? result : tmp;
                }
            }
        }
        return result;
    }
}

实验效果分析

时间复杂度

Stack + DP

$n$

Stack

$n$

空间复杂度

Stack + DP

$2n$

Stack

$n$


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode 240:搜索二维矩阵II Leetcode 240:搜索二维矩阵II
搜索二维矩阵II题目描述编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例现有矩阵 matrix 如下:
2020-03-05
下一篇 
SAE:Rank+(预训练+GNN联合训练) SAE:Rank+(预训练+GNN联合训练)
1390a92507fcdb52d6ceac5012267f370dbd3bbe32520d597c6da66b9e4569adc194b899baf987ea3f3b1506d6149ce5c3fe16aea289c3f1c4195
2020-03-04
  目录