给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
该问题有多种方法可以进行求解
首先使用的是
贪心算法
- 计算左括号和右括号的关系
- 如果右括号的个数大于左括号的个数,就不是有效的括号,需要重新归零计算
- 该方法需要从左向右,再从右向左计算一次,才能历遍所有的可能性
- 因为两个方向的历遍的思路是一样的,因此只需要调用两次函数,但是需要定义历遍的顺序,用T/F表示
class Solution:
def longestValidParentheses(self, s: str) -> int:
if not s:return 0
def comp(s,order):
left = right = 0
res = 0
for r in s:
if r == '(':
left += 1
else:
right += 1
if left == right:
res = max(res,left)
elif order ^ (left > right):
left = right = 0
return res
return (2*max(comp(s,True),comp(s[::-1],False)))
使用栈的方法也很巧妙
在stack中记录有效括号的开头stack[-1]
class Solution:
def longestValidParentheses(self, s: str) -> int:
if not s:return 0
stack = [-1]
length = len(s)
res = 0
for l in range(length):
if s[l] == '(':
stack.append(l)
else:
stack.pop()
if not stack:
stack.append(l)
else:
res = max(res,l-stack[-1])
return res
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses