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

脚本二逻辑:

  • 此脚本的处理逻辑非常巧妙,灵活地运用了最大值和栈的出入思想
  • 脚本通过栈的思想能灵活识别有效括号,并且遇到非有效括号时,如何通过改变栈的元素来达到初始化的效果
  • 最后通过大小比较,一直获得最大的有效括号长度
  • 此脚本逻辑值得细细品尝
posted @ 2019-12-17 23:36  弈虫  阅读(135)  评论(0编辑  收藏  举报