zoukankan      html  css  js  c++  java
  • 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

    脚本二逻辑:

    • 此脚本的处理逻辑非常巧妙,灵活地运用了最大值和栈的出入思想
    • 脚本通过栈的思想能灵活识别有效括号,并且遇到非有效括号时,如何通过改变栈的元素来达到初始化的效果
    • 最后通过大小比较,一直获得最大的有效括号长度
    • 此脚本逻辑值得细细品尝
  • 相关阅读:
    !clrstack未显示任何方法名
    !dumpheap参数和SOS帮助系统的一些一般信息
    WinDbg Script---显示RCW对象引用的COM对象
    为什么不能将2个调试器附加到1个进程
    什么是互操作调试(Interop-Debugging)?
    为什么托管调试与本机调试不同?
    在WinDBG中管理源代码窗口
    如何从转储文件确定 /LARGEADDRESSAWARE
    Dump文件数据存储格式(九)
    Windbg命令系列---!cpuid(CPU信息)
  • 原文地址:https://www.cnblogs.com/mailong/p/12057591.html
Copyright © 2011-2022 走看看