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

浙公网安备 33010602011771号