秋招-算法-最长有效括号

64 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情 >>

一、题目 LeetCode - 32

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

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

示例 2:

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

示例 3:

输入:s = ""
输出:0
  • 0 <= s.length <= 3 * 104
  • s[i] 为 '(' 或 ')'

二、解题思路

本题需要找到最长有效括号子串,可以参考括号匹配方法使用栈来解决。大体思路为是遍历字符串,每当遇到左括号则将左括号的索引入栈,遇到右括号则将索引出栈。在出栈时需要判断栈中是否还有元素;为了方便计算字串长度,始终保持栈底元素为当前已经遍历过的元素中最后一个没有被匹配的右括号的下标。这样,在栈不为空的情况下,当前右括号的索引减去栈顶元素,即为以该右括号为结尾的最长有效括号的长度。 在对栈初始化时,我们需要将-1先压入栈中。

三、代码

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

四、总结

本题参考括号匹配,使用栈来解决。需要注意的是,与括号匹配不同,本题需要找到的是最长有效括号子串长度,而不是有效括号的个数,例如:"()(()",其最长有效括号字串为"()",长度是2;然而其有效括号的个数为4个,即"()"和"()"。所以需要对代码进行更改。时间复杂度为O(n),空间复杂度为O(n)。