返回

LeetCode刷题:移除无效的括号(1249)深入解析

前端

问题

LeetCode 1249题要求你移除无效的括号,使得括号有效。一个括号序列被认为是有效的,当且仅当它满足以下条件:

  • 每个左括号 '(' 都与一个右括号 ')' 匹配,反之亦然。
  • 左括号 '(' 必须出现在右括号 ')' 之前。

解题思路

要解决这个问题,我们可以使用贪心算法。具体步骤如下:

  1. 遍历字符串: 从左到右遍历给定的字符串。
  2. 计数器: 使用两个计数器 leftright 来分别跟踪左括号和右括号的数量。
  3. 判断是否有效: 在遍历过程中,检查 leftright 的差值是否为0。如果是,则字符串目前是有效的。
  4. 移除无效括号: 如果字符串当前无效,则移除当前字符。
  5. 更新计数器: 如果移除的是左括号,则 left 减1;如果移除的是右括号,则 right 减1。
  6. 继续遍历: 重复步骤1-5,直到遍历结束。

示例

考虑字符串 "(a)())()".

  • 遍历第一个字符 (left 增加1,right 保持为0。
  • 遍历第二个字符 a:忽略,因为它不是括号。
  • 遍历第三个字符 (left 增加1,right 保持为0。
  • 遍历第四个字符 )left 保持为1,right 增加1。
  • 遍历第五个字符 )left 保持为1,right 增加1。

此时,leftright 的差值为0,表明字符串是有效的。因此,最终的结果字符串为 "(a)()".

代码实现

以下是用Python实现的贪心算法代码:

def removeInvalidParentheses(s):
  left = right = 0
  res = []

  # 从左到右遍历字符串
  for char in s:
    if char == '(':
      left += 1
    elif char == ')':
      if left > 0:
        left -= 1
      else:
        right += 1

  # 从右到左遍历字符串,移除多余的右括号
  for char in s[::-1]:
    if char == ')':
      if right > 0:
        right -= 1
      else:
        left -= 1
        res.append(char)
    else:
      res.append(char)

  # 反转结果字符串并返回
  return ''.join(res[::-1])

总结

通过移除无效的括号,我们可以将一个无效的括号序列转换为有效的序列。使用贪心算法,我们可以高效地解决这个问题。LeetCode 1249题是一个练习算法和数据结构的好题,它有助于提高我们解决现实世界问题的编程能力。