【动态规划】day65_32. 最长有效括号

45 阅读1分钟

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

示例 1:

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

示例 2:

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

示例 3:

输入: s = ""
输出: 0

  提示:

  • 0 <= s.length <= 3 * 104
  • s[i] 为 '(' 或 ')'

题解:

思路:栈

  • 如果遇到左括号 '(',将它的索引压入栈中。
  • 如果遇到右括号 ')':
  • 首先弹出栈顶元素,表示匹配了一个左括号。
  • 如果栈变空了,将当前右括号的索引压入栈中。
  • 如果栈不为空,计算当前有效子串的长度,即 当前索引 - 栈顶元素,并更新最大长度。

时间复杂度:O(n)

空间复杂度:O(n)

class Solution {
    public int longestValidParentheses(String s) {
        int maxans = 0;
        Deque<Integer> stack = new LinkedList<Integer>();
        stack.push(-1);
        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 {
                    maxans = Math.max(maxans, i - stack.peek());
                }
            }
        }
        return maxans;
    }
}