📅  最后修改于: 2023-12-03 14:55:23.202000             🧑  作者: Mango
括号序列是由左右括号组成的序列,左右括号必须匹配,且左右括号的数量相等。
例如,"()"、"()()"和"(())"都是括号序列,但是"("、")("和"))(("不是。
最长正确的括号子序列指的是在一个给定的括号序列中,最长的连续的括号子序列,使得其中左右括号都匹配。
例如,对于括号序列"((()())())",最长的连续的括号子序列是"()()",长度为4。
下面给出一个使用栈的算法,时间复杂度为O(n)。
def longest_valid_parentheses(s: str) -> tuple:
stack = []
start = -1
max_len = 0
for i, char in enumerate(s):
if char == '(':
stack.append(i)
else:
if not stack:
start = i
else:
stack.pop()
if not stack:
max_len = max(max_len, i - start)
else:
max_len = max(max_len, i - stack[-1])
start = stack[-1]
return start, start+max_len
s = "(()",最长括号匹配子序列为"()",左右端点为(1, 2) s = ")()())",最长括号匹配子序列为"()()",左右端点为(1, 4)
以上算法使用了栈来维护括号序列中左右括号的匹配关系,通过遍历括号序列来更新最长的括号匹配子序列长度。该算法简单易懂,时间复杂度为O(n),适用于较大的括号序列查询。