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