Leetcode_32【最长有效括号】
文章目录:
- 题目
- 脚本一
- 脚本一逻辑
- 脚本二
- 脚本二逻辑
题目:
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
脚本一:【用时:2632ms】
class Solution: def longestValidParentheses(self, s: str) -> int: flag = 'bb' list1 = list(s) list2 = [] ret = [] n2,n3,n4,n5 = 0,0,0,0 while True: try: n1 = list1.index(")") except ValueError: flag = 'xx' break if flag == 'bb' and n1 != 0: if list1[n1 - 1] == "(": n2 = len(list2) list2.append(n1+n2*2+n3) list1.pop(n1) list1.pop(n1-1) elif n1 == 0: n3 += 1 list1.pop(n1) if list2: pass else: return(0) for j in range(max(list2),-1,-1): if j in list2: n5 += 1 else: if n5 > 0: list2.append(j) n5 -= 1 else: pass list2.sort() for i in list2: if (i+1) in list2: n4 += 1 else: n4 += 1 ret.append(n4) n4 = 0 if ret: return(max(ret)) else: return(0)
脚本一逻辑:
- 此脚本是笔者想到的暴力破解的方法,主要逻辑是有效括号的组成要素一定为,右边为")",其左边一定为"("
- 根据上面的要素,脚本会从给定字符串转化的列表的第一个元素开始遍历,当遇到第一个")"符号时,检查此符号左边符号是否为"(";若是则将符号")"的索引值存放到一个记录列表中,然后将这两个符号都从遍历列表中弹出,往下继续执行,直到结束为止
- 记录符合有效括号右符号")"的原索引值是此脚本的关键,比给定符号为")()(())",符合有效括号的右括号索引值为[2,5,6];则通过右括号的索引值可以知道对应的左括号索引值为[1,3,4],结合起来就是[1,2,3,4,5,6]
- 取上一步中得到的左右括号索引值中,最长的连续数字即为目标数字也为最长有效括号,可知[1,2,3,4,5,6]中最长连续数字为:3,4,5,6长度为4
脚本二:【用时44ms】【转载】
class Solution: def longestValidParentheses(self, s: str) -> int: if(not s): return 0 stack=[-1] res=0 for i in range(len(s)): if(s[i]=="("): stack.append(i) else: stack.pop() if(not stack): stack.append(i) else: res=max(res,i-stack[-1]) return res
脚本二逻辑:
- 此脚本的处理逻辑非常巧妙,灵活地运用了最大值和栈的出入思想
- 脚本通过栈的思想能灵活识别有效括号,并且遇到非有效括号时,如何通过改变栈的元素来达到初始化的效果
- 最后通过大小比较,一直获得最大的有效括号长度
- 此脚本逻辑值得细细品尝