返回
LeetCode 1249. Minimum Remove to Make Valid Parentheses:Python 精彩解读
后端
2024-01-01 14:48:05
算法概览
LeetCode 1249 题要求您找出移除最少数量的括号,以使给定字符串中的所有括号都匹配有效。为此,我们需要借助栈这一数据结构。栈遵循后进先出的原则,恰好可以用来处理括号匹配的问题。
我们从字符串的左到右扫描,遇到左括号时将它压入栈中,遇到右括号时,如果栈顶元素是左括号,则将它们匹配并弹出栈顶元素。如果栈顶元素不是左括号,则将该右括号视为不匹配,将其添加到需要移除的括号列表中。
扫描结束后,栈中可能还残留一些未匹配的左括号。这些左括号也需要添加到需要移除的括号列表中。
Python 实现
def minRemoveToMakeValid(s):
"""
:type s: str
:rtype: str
"""
# 使用栈来存储左括号的下标
stack = []
# 需要移除的括号的下标
remove = set()
# 从左到右扫描字符串
for i, c in enumerate(s):
if c == '(':
# 将左括号的下标压入栈中
stack.append(i)
elif c == ')':
# 如果栈顶元素是左括号,则将它们匹配并弹出栈顶元素
if stack:
stack.pop()
# 否则,将该右括号视为不匹配
else:
remove.add(i)
# 将栈中残留的左括号的下标添加到需要移除的括号列表中
remove |= set(stack)
# 构造新的字符串
result = []
for i, c in enumerate(s):
if i not in remove:
result.append(c)
return ''.join(result)
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串的长度。我们只需要从左到右扫描字符串一次,因此时间复杂度为 O(n)。
- 空间复杂度:O(n),在最坏的情况下,栈中可能存储所有左括号的下标,因此空间复杂度为 O(n)。
结语
LeetCode 1249 题是一道经典的“括号”类题目,考察的就是栈的使用。这道题还结合了字母和括号的复杂情况,基本思路不变,具体还要结合题意进行分析。如果您对这道题还有任何疑问,欢迎在评论区留言。