leetcode(16)-最长的有效的括号

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

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

输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

链接:https://leetcode-cn.com/problems/longest-valid-parentheses
一遍扫过去,把能够有效匹配的括号从栈里面踢出去,剩下的就是那些端点,端点之间的都是有效子串,找到最长的就行,注意要把头部和尾部自己填进去,时间和空间效率不高,应该在扫的过程中就把长度给算出来。

自己的解法

class Solution:
    def longestValidParentheses(self, s: str) -> int:

        def isValid(s,start,end):
            stack = []
            mapping = {')':'('}
            for i in range(start,end+1):
                char = s[i]
                if char in mapping:
                    top_element = stack.pop() if stack else ('#',-1)
                    if mapping[char] !=top_element[0]:
                        stack.append(top_element)
                        stack.append((char,i))
                else:
                    stack.append((char,i))
            return stack
        lists = isValid(s,0,len(s)-1)
        maxl = 0
        if len(lists)==0:
            return len(s)        
        lists.insert(0,('#',-1))
        lists.append(('#',len(s)))
        for j in range(0,len(lists)-1):
            maxl = max(maxl,lists[j+1][1]-lists[j][1]-1)
        return maxl

动态规划

d[i]表示以i结尾的最长的有效子串

di[i]必须以')'结尾
子问题分为两类,如果s[i-1]='(',
d[i] = d[i-1]+2

如果s[i-1]=')'
s[i-d[i-1]-1]需要是')'
d[i] = d[i-1]+ d[i-d[i-1]-2] +2

posted @ 2020-01-05 18:19  木子士心王大可  阅读(117)  评论(0)    收藏  举报