返回
LeetCode 32. Longest Valid Parentheses 用Python解决
后端
2023-10-16 11:48:04
栈解法
栈是一种先进先出(First-In-First-Out, FIFO)的数据结构,它非常适合解决括号匹配问题。我们可以使用栈来存储左括号的位置,当遇到右括号时,如果栈不为空,并且栈顶元素是左括号,则弹出栈顶元素,表示一对括号匹配成功。否则,说明括号不匹配,我们就更新最长有效括号的长度。
def longest_valid_parentheses(s):
stack = []
max_length = 0
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 + 1)
else:
max_length = max(max_length, i - stack[-1])
return max_length
动态规划解法
动态规划是一种自底向上的解决问题的策略,它将大问题分解成一系列小问题,然后逐个解决这些小问题,最终解决大问题。对于最长有效括号问题,我们可以定义一个dp数组,dp[i]表示以第i个字符结尾的最长有效括号的长度。
def longest_valid_parentheses(s):
dp = [0] * len(s)
max_length = 0
for i in range(1, len(s)):
if s[i] == ')':
if s[i - 1] == '(':
dp[i] = dp[i - 2] + 2
elif i - dp[i - 1] > 0 and s[i - dp[i - 1] - 1] == '(':
dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2
max_length = max(dp)
return max_length
比较
栈解法和动态规划解法各有优缺点。栈解法比较简单,易于理解,但时间复杂度为O(n),空间复杂度为O(n)。动态规划解法的时间复杂度为O(n^2),空间复杂度为O(n),但它可以处理更复杂的情况,例如嵌套括号。
总结
在本文中,我们介绍了如何使用栈和动态规划来解决LeetCode 32:最长有效括号问题。我们比较了这两种方法的优缺点,并讨论了它们的适用场景。希望本文对您有所帮助。