最长有效括号 |刷题打卡

503 阅读1分钟

掘金团队号上线,助你 Offer 临门! 点击 查看大厂春招职位

一、题目描述:

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

示例 1:

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

示例 2:

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

示例 3:

输入:s = ""
输出:0

题目地址:leetcode-cn.com/problems/lo…

二、思路分析:

采用栈,判断栈顶元素与当前元素是否匹配,匹配成功则弹出,不成功则压入栈,入栈的是索引值,不是字符。

遇到 '(' 入栈索引值

遇到 ')' 先出栈,

如果栈为空,直接入栈

如果栈不空,用当前索引减去栈顶索引,即得新的有效格式的长度。

三、AC 代码:

public static int longestValidParentheses(String s) {
    int ans = 0;
    Stack<Integer> stack = new Stack<>();
    stack.push(-1);
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c == '(') {
            stack.push(i);
        } else {
            stack.pop();
            if (stack.empty()) {
                stack.push(i);
            } else {
                ans = i - stack.peek() > ans ? i - stack.peek() : ans;
            }
        }
    }
    return ans;
}

四、总结:

一定要注意题目是 最长 有效括号,并不是判断参数 s 是否是有效括号。