返回
LeetCode刷题:移除无效的括号(1249)深入解析
前端
2024-01-11 01:18:51
问题
LeetCode 1249题要求你移除无效的括号,使得括号有效。一个括号序列被认为是有效的,当且仅当它满足以下条件:
- 每个左括号 '(' 都与一个右括号 ')' 匹配,反之亦然。
- 左括号 '(' 必须出现在右括号 ')' 之前。
解题思路
要解决这个问题,我们可以使用贪心算法。具体步骤如下:
- 遍历字符串: 从左到右遍历给定的字符串。
- 计数器: 使用两个计数器
left
和right
来分别跟踪左括号和右括号的数量。 - 判断是否有效: 在遍历过程中,检查
left
和right
的差值是否为0。如果是,则字符串目前是有效的。 - 移除无效括号: 如果字符串当前无效,则移除当前字符。
- 更新计数器: 如果移除的是左括号,则
left
减1;如果移除的是右括号,则right
减1。 - 继续遍历: 重复步骤1-5,直到遍历结束。
示例
考虑字符串 "(a)())()".
- 遍历第一个字符
(
:left
增加1,right
保持为0。 - 遍历第二个字符
a
:忽略,因为它不是括号。 - 遍历第三个字符
(
:left
增加1,right
保持为0。 - 遍历第四个字符
)
:left
保持为1,right
增加1。 - 遍历第五个字符
)
:left
保持为1,right
增加1。
此时,left
和 right
的差值为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题是一个练习算法和数据结构的好题,它有助于提高我们解决现实世界问题的编程能力。