返回

用最长有效括号找出匹配的括号数

前端

好的,以下为由 AI 螺旋创作器编写的文章:







## 算法概述

「最长有效括号」算法,是一种可以帮助我们找到给定字符串中最长有效括号子串的算法。有效括号子串是指左括号和右括号严格成对且顺序匹配的子串。

让我们来看一个例子:

"(()"


在这个字符串中,最长有效括号子串是 "()",因为它是唯一一个左右括号成对且顺序匹配的子串。

## 算法实现

### 动态规划

我们可以使用动态规划来解决这个问题。首先,我们需要创建一个表 `dp` 来存储子问题的结果。其中,`dp[i]` 表示字符串 `s` 中以第 `i` 个字符结尾的最长有效括号子串的长度。

def longestValidParentheses(s):

初始化 dp 表

dp = [0] * len(s)

遍历字符串

for i in range(1, len(s)):
# 如果当前字符是右括号
if s[i] == ')':
# 如果前一个字符是左括号,则更新 dp[i]
if s[i - 1] == '(':
dp[i] = dp[i - 2] + 2
# 如果前一个字符是右括号,则更新 dp[i]
elif s[i - 1] == ')':
# 如果前一个有效括号的起始位置不为 -1,则更新 dp[i]
if dp[i - 1] > 0:
dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]

返回最长有效括号的长度

return max(dp)


### 栈

我们也可以使用栈来解决这个问题。首先,我们需要创建一个栈来存储左括号的索引。然后,遍历字符串,当遇到左括号时,将其索引压入栈中。当遇到右括号时,如果栈不为空,则弹出栈顶元素。否则,我们知道这是一个不匹配的右括号,可以忽略。

def longestValidParentheses(s):

创建栈来存储左括号的索引

stack = []

遍历字符串

max_length = 0
current_length = 0
for i in range(len(s)):
# 如果当前字符是左括号,则将其索引压入栈中
if s[i] == '(':
stack.append(i)
# 如果当前字符是右括号,并且栈不为空,则弹出栈顶元素
elif s[i] == ')' and stack:
stack.pop()
# 如果栈为空,则更新最长有效括号的长度
if not stack:
current_length = i + 1
# 否则,更新当前有效括号的长度
else:
current_length = i - stack[-1]

  # 更新最长有效括号的长度
  max_length = max(max_length, current_length)

返回最长有效括号的长度

return max_length


## 复杂度分析

### 动态规划

动态规划算法的时间复杂度为 `O(n^2)`,空间复杂度为 `O(n)`。

### 栈

栈算法的时间复杂度为 `O(n)`,空间复杂度为 `O(n)`。

## 总结

「最长有效括号」算法是一个经典的算法问题,可以帮助我们找到给定字符串中最长有效括号子串。我们可以使用动态规划或栈来高效地解决这个问题。