返回
对算法初学者一招鲜吃遍天:详解1249. 移除无效的括号
前端
2024-01-02 17:46:17
在这互联网高速发展的时代,算法越来越成为我们日常生活的一部分。算法思维的培养已经成为了很多人的刚需。算法学习也是很多人在日常工作中的一项重要技能。[路飞]_leetcode刷题作为算法学习的权威平台,为算法爱好者们提供了很多优质的算法题库,帮助大家提升自己的算法技能。LeetCode 1249. 移除无效的括号就是其中一道热门算法题,下面就让我们一起来学习一下这道题的解题思路和方法。
题目概述
给你一个由 '('、')' 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。
解题思路
这道题的解题思路主要分为以下几步:
- 首先,我们需要判断字符串是否有效。如果字符串是有效的,则不需要进行任何操作。如果字符串无效,则需要进行以下操作:
- 找到字符串中所有无效的括号。我们可以通过以下方法找到无效的括号:
- 从左到右遍历字符串,如果遇到一个左括号,则将其压入栈中。
- 从左到右遍历字符串,如果遇到一个右括号,则检查栈中是否有左括号。如果有,则将左括号和右括号都弹出栈。如果没有,则说明这是一个无效的右括号。
- 将栈中剩下的左括号都标记为无效的左括号。
- 删除字符串中所有无效的括号。我们可以通过以下方法删除无效的括号:
- 从左到右遍历字符串,如果遇到一个无效的左括号,则将其删除。
- 从左到右遍历字符串,如果遇到一个无效的右括号,则将其删除。
- 返回删除了无效括号后的字符串。
代码实现
def removeInvalidParentheses(s):
"""
:type s: str
:rtype: str
"""
# 判断字符串是否有效
if isValid(s):
return s
# 找到字符串中所有无效的括号
invalid_left = []
invalid_right = []
stack = []
for i, c in enumerate(s):
if c == '(':
stack.append(i)
elif c == ')':
if stack:
stack.pop()
else:
invalid_right.append(i)
while stack:
invalid_left.append(stack.pop())
# 删除字符串中所有无效的括号
result = []
for i, c in enumerate(s):
if i not in invalid_left and i not in invalid_right:
result.append(c)
return ''.join(result)
def isValid(s):
"""
:type s: str
:rtype: bool
"""
stack = []
for c in s:
if c == '(':
stack.append(c)
elif c == ')':
if stack:
stack.pop()
else:
return False
return not stack
总结
这道题主要考察了我们对动态规划的掌握情况。通过这道题,我们可以学习到如何利用动态规划来解决这类问题。此外,这道题还考察了我们的算法思维能力。通过这道题,我们可以学习到如何通过分析字符串的结构来找到解决问题的思路。希望这道题对大家的算法学习有所帮助。