来源:力扣(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) 。
 
好了,今天就到这里,感谢各位看官到这里,不如点个关注吧!
�