返回
LeetCode 之 Python 遍历之手,探寻最长有效括号子串之妙
后端
2023-12-25 14:30:18
算法概述
算法核心在于维护一个栈,用以跟踪左括号 (
的位置,当遇到一个右括号 )
时,若栈不空且栈顶元素为左括号 (
,则将栈顶元素出栈,有效子串长度加二;否则,将当前右括号 )
的位置压入栈中。
代码实现
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 为我们提供了一个绝佳的平台,让我们在挑战中不断成长。