32.最长有效括号 python

题目

题目描述

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

示例 1:

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

示例 2:

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

示例 3:

输入:s = “”
输出:0

提示:

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

题目链接

最长有效括号

题解

要解决这个问题,我们可以使用栈(stack)来帮助我们追踪括号匹配的情况。具体来说,栈可以帮助我们记住每一个未匹配的左括号的位置,当我们遇到一个右括号时,可以尝试与最近的未匹配的左括号进行匹配,并计算有效括号子串的长度。

此外,为了处理所有可能的有效括号子串,我们需要考虑从字符串的两端进行扫描。这是因为有些情况下,仅从左到右或仅从右到左的一次扫描无法覆盖所有的有效括号组合。例如,在字符串 ")(()())" 中,从左到右扫描会错过中间的 "()()" 有效子串;而从右到左扫描则能正确捕捉到这个情况。

下面是具体的算法实现:

算法步骤:

  1. 初始化变量:设置两个计数器 leftright 分别记录左括号和右括号的数量,以及结果变量 max_len 来保存最长有效括号子串的长度。
  2. 从左向右扫描:遍历字符串,当遇到左括号时增加 left 计数,遇到右括号时增加 right 计数。如果 leftright 相等,则更新 max_len;如果 right 大于 left,重置计数器。
  3. 从右向左扫描:同样地,重新遍历字符串但这次是从右往左,目的是为了捕捉那些在第一次扫描中被忽略的有效括号子串。这里需要交换 leftright 的角色。
  4. 返回结果:最终返回 max_len

这种方法的时间复杂度是 O(n),因为每个字符最多被访问两次(一次从左到右,一次从右到左),空间复杂度是 O(1),因为我们只用了常数级别的额外空间。

python实现

以下是 Python 实现代码:

def longestValidParentheses(s: str) -> int:
    left = right = max_len = 0

    # From left to right
    for char in s:
        if char == '(':
            left += 1
        elif char == ')':
            right += 1
        
        if left == right:
            max_len = max(max_len, 2 * right)
        elif right > left:
            left = right = 0

    left = right = 0

    # From right to left
    for char in reversed(s):
        if char == '(':
            left += 1
        elif char == ')':
            right += 1
        
        if left == right:
            max_len = max(max_len, 2 * left)
        elif left > right:
            left = right = 0

    return max_len

解释:

  • 第一次扫描(从左到右):这一步确保了我们可以找到所有以左括号开始的有效括号子串。
  • 第二次扫描(从右到左):这一步是为了补充第一次扫描中可能遗漏的情况,即那些以右括号结束的有效括号子串。

通过结合这两个方向的扫描,我们可以准确地找出最长的有效括号子串。

提交结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gxls2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值