当前位置: 面试刷题>> 最长有效括号 (经典算法题500道)


题目描述补充

题目:最长有效括号

给定一个只包含 '('')' 的字符串,找出最长的包含有效括号的子串的长度。

有效括号必须满足以下条件:

  • 左括号 ( 必须用相同数量的右括号 ) 包裹起来。
  • 每个右括号 ) 必须有一个对应的左括号 (

示例 1:

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

示例 2:

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

示例 3:

输入: ""
输出: 0

PHP 示例代码

function longestValidParentheses($s) {
    $maxLen = 0;
    $stack = [];
    $left = -1; // 记录左括号的位置

    for ($i = 0; $i < strlen($s); $i++) {
        if ($s[$i] == '(') {
            $stack[] = $i;
        } else {
            if (empty($stack)) {
                $left = $i; // 当栈为空时,更新left为当前位置
            } else {
                array_pop($stack);
                if (empty($stack)) {
                    // 栈为空,说明从left到i都是有效括号
                    $maxLen = max($maxLen, $i - $left);
                } else {
                    // 栈不为空,则计算当前位置到栈顶元素位置的距离
                    $maxLen = max($maxLen, $i - $stack[count($stack) - 1]);
                }
            }
        }
    }

    return $maxLen;
}

// 示例
echo longestValidParentheses("(()"); // 输出 2
echo longestValidParentheses(")()())"); // 输出 4
echo longestValidParentheses(""); // 输出 0

Python 示例代码

def longestValidParentheses(s):
    max_len = 0
    stack = []

    for i, char in enumerate(s):
        if char == '(':
            stack.append(i)
        else:
            if not stack:
                start = i + 1
            else:
                stack.pop()
                if not stack:
                    max_len = max(max_len, i - start + 1)
                else:
                    max_len = max(max_len, i - stack[-1])

    return max_len

# 示例
print(longestValidParentheses("(()"))  # 输出 2
print(longestValidParentheses(")()())"))  # 输出 4
print(longestValidParentheses(""))  # 输出 0

JavaScript 示例代码

function longestValidParentheses(s) {
    let maxLen = 0;
    const stack = [];
    let left = -1;

    for (let i = 0; i < s.length; i++) {
        if (s[i] === '(') {
            stack.push(i);
        } else {
            if (stack.length === 0) {
                left = i;
            } else {
                stack.pop();
                if (stack.length === 0) {
                    maxLen = Math.max(maxLen, i - left);
                } else {
                    maxLen = Math.max(maxLen, i - stack[stack.length - 1]);
                }
            }
        }
    }

    return maxLen;
}

// 示例
console.log(longestValidParentheses("(()")); // 输出 2
console.log(longestValidParentheses(")()())")); // 输出 4
console.log(longestValidParentheses("")); // 输出 0

// 码小课网站中有更多相关内容分享给大家学习

以上代码示例展示了如何使用栈来解决“最长有效括号”问题,并给出了 PHP、Python 和 JavaScript 的实现方式。

推荐面试题