最长有效括号——力扣算法系列10

2020.07.04 周六
32最长有效括号
题目:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”

示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
——————————我是分割线——————————
解法:
思路:使用堆栈。遇到“(”,则将其下标压入栈;遇到“)”,且前面没有“(”与之对应,则将最后一个“)”的下标存到stack中;遇到“)”,且前面有“(”与之对应,则pop删除“(”的下标,并计算res=index-stack[-1](当前下标 - stack中最后一个元素的下标stack[-1])。
注意stack初始化-1,因为如果以"()"开头,则res=1-(-1)=2
如果以右括号开头/前面没有左括号与之对应,则将最后一个右括号的下标存入stack(转化为stack长度是否为1的问题),如果大于1则说明前面有未匹配的左括号;如果等于1则说明前面没有未匹配的左括号,则重新初始化stack,以下一次左括号的前一个元素的下标作为stack的初始值。

下面用到的一个Python内置函数——enumerate
(相关知识 传送门:enumerate()函数

代码:

class Solution(object):
    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        """
        res = 0
        stack = [-1] #初始化堆栈为-1 以便一开始() res=1-(-1)
        for index,key in enumerate(s): #遍历s获取索引和值
            if key=="(": #左括号 则下标进栈
                stack.append(index)
            elif len(stack)==1: #右括号 且前面没有(匹配 则保留最后右括号的下标
                stack.pop()
                stack.append(index)
            else: #右括号 且前面有(匹配 则删除(下标 计算res  更新res
                stack.pop()
                res = max(res,index-stack[-1])
        return res

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值