刷题LeetCode:32.最长有效括号

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses/

题目描述

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

题目分析

栈:先进后出

思路:可参考『刷题LeetCode:20.有效的括号』,加上求最大值的逻辑

代码实现

public class LongestValidParentheses32 {


    public static void main(String[] args) {
        LongestValidParentheses32 result = new LongestValidParentheses32();
        System.out.println(result.longestValidParentheses("()()()))))))))(((()()"));
    }



    /**
     * 【方法 1:栈】
     * 给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
     *
     *
     * 时间复杂度: O(n),n 是给定字符串的长度。我们只需要遍历字符串一次即可。
     *
     * 空间复杂度: O(n)。栈的大小在最坏情况下会达到 n,因此空间复杂度为 O(n) 。
     *
     */
    public int longestValidParentheses(String s) {

        int maxLen = 0;
        int length = s.length();

        LinkedList<Integer> stack = new LinkedList<Integer>();
        stack.addLast(-1);

        for (int i = 0; i < length; i++) {
            char ch = s.charAt(i);
            if (ch == '(') {
                stack.addLast(i);
            }
            if (ch == ')') {
                stack.removeLast();
                if (stack.isEmpty()) {
                    // 未匹配到 "("
                    stack.addLast(i);
                } else {
                    // 匹配到 "("
                    if ((i - stack.getLast()) > maxLen) {
                        maxLen = i - stack.getLast();
                    }
                }
            }
        }

        return maxLen;

    }


}

复杂度

  • 时间复杂度:O(logn),其中 n 是定版本的数量。
  • 空间复杂度:O(n)。栈的大小在最坏情况下会达到 n,因此空间复杂度为 O(n) 。

好了,今天就到这里,感谢各位看官到这里,不如点个关注吧!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容