给定仅包含字符'('和')'的字符串,请找到最长的有效(格式正确)括号子字符串的长度。
Input: '(()'
Output: 2 '()'长度为2
Input: ')()())'
Output: 4 '()()'长度为4
Method 1遍历所有连续的子括号,如果有效则取最大的长度(Time Limit Exceeded超时)
首先利用之前22题第二个方法判断括号是否有效的函数判断是否有效。
然后遍历连续括号,括号要限定以‘(’为开头。将括号添加到一个新的变量res中,如果满足有效括号则取之前有效括号长度和现在括号长度的最大值。
class Solution(object):
def longest(self, s):
length=0
for i in range(len(s)):
res = ''
if s[i] == '(' or len(res) > 0:
res += s[i]
for j in range(i+1,len(s)):
res+=s[j]
if self.valid(res):
length=max(length,len(res))
return length
def valid(self,c):
r = 0
for _ in c:
if _ == '(':
r += 1
else:
r -= 1
if r < 0:
return False
return r == 0
Method 2从左往右,从右往左遍历括号
初始化l,r代表左右括号的个数,maxlen代表最大长度。
从左往右:当遍历到的括号为‘(’时,l++;否则r++。当l=r时则证明括号匹配,取最大长度max(maxlen, 2*r);否则当r>l时证明右括号多, 不匹配, 所以l和r的值变为0重新计算
从右往左: 同理, 取最大长度时r变为l, 判断不匹配条件是l>r
最后返回最大长度。
class Solution:
def longestValidParentheses(self, s: str) -> int:
l=r=maxlen=0
for i in range(len(s)):
if s[i]=='(':
l+=1
else:
r+=1
if l==r:
maxlen=max(maxlen,2*r)
elif r>l:
l=r=0
l=r=0
for j in range(len(s)-1,0,-1):
if s[j]=='(':
l+=1
else:
r+=1
if l==r:
maxlen=max(maxlen,2*l)
elif l>r:
l=r=0
return maxlen
时间复杂度O(n)遍历括号两次,空间复杂度O(1)只需要l和r的值。