返回

LeetCode 之 Python 遍历之手,探寻最长有效括号子串之妙

后端

算法概述

算法核心在于维护一个栈,用以跟踪左括号 ( 的位置,当遇到一个右括号 ) 时,若栈不空且栈顶元素为左括号 (,则将栈顶元素出栈,有效子串长度加二;否则,将当前右括号 ) 的位置压入栈中。

代码实现

def longest_valid_parentheses(s):
  stack = []  # 栈,存储左括号 `(` 的位置
  max_length = 0  # 最长有效子串长度
  start = -1  # 上一个有效子串的起始位置

  for i, char in enumerate(s):
    if char == '(':
      stack.append(i)  # 将左括号位置压入栈中
    else:  # 右括号
      if stack:  # 如果栈不空
        stack.pop()  # 弹出栈顶元素
        if not stack:  # 如果栈空,说明当前右括号与之前的一个左括号匹配
          max_length = max(max_length, i - start)
        else:  # 如果栈不空,说明当前右括号与栈顶元素匹配
          max_length = max(max_length, i - stack[-1])
      else:  # 如果栈空,说明当前右括号不匹配任何左括号
        start = i  # 将当前位置作为新的有效子串的起始位置

  return max_length


# 示例输入和输出
input1 = "(()"
print("输入: ", input1)
print("输出: ", longest_valid_parentheses(input1))  # 输出: 2

input2 = ")()())"
print("输入: ", input2)
print("输出: ", longest_valid_parentheses(input2))  # 输出: 4

input3 = "(((()))"
print("输入: ", input3)
print("输出: ", longest_valid_parentheses(input3))  # 输出: 6

总结

这道题考验了我们对栈的使用和对括号匹配的理解。通过巧妙地使用栈,我们可以有效地找到最长有效括号子串的长度。在解决编程难题的过程中,我们不仅需要掌握编程语言的语法和技巧,更需要培养逻辑思维能力和对问题的洞察力。LeetCode 为我们提供了一个绝佳的平台,让我们在挑战中不断成长。