返回

对算法初学者一招鲜吃遍天:详解1249. 移除无效的括号

前端

在这互联网高速发展的时代,算法越来越成为我们日常生活的一部分。算法思维的培养已经成为了很多人的刚需。算法学习也是很多人在日常工作中的一项重要技能。[路飞]_leetcode刷题作为算法学习的权威平台,为算法爱好者们提供了很多优质的算法题库,帮助大家提升自己的算法技能。LeetCode 1249. 移除无效的括号就是其中一道热门算法题,下面就让我们一起来学习一下这道题的解题思路和方法。

题目概述

给你一个由 '('、')' 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。

解题思路

这道题的解题思路主要分为以下几步:

  1. 首先,我们需要判断字符串是否有效。如果字符串是有效的,则不需要进行任何操作。如果字符串无效,则需要进行以下操作:
  2. 找到字符串中所有无效的括号。我们可以通过以下方法找到无效的括号:
    • 从左到右遍历字符串,如果遇到一个左括号,则将其压入栈中。
    • 从左到右遍历字符串,如果遇到一个右括号,则检查栈中是否有左括号。如果有,则将左括号和右括号都弹出栈。如果没有,则说明这是一个无效的右括号。
    • 将栈中剩下的左括号都标记为无效的左括号。
  3. 删除字符串中所有无效的括号。我们可以通过以下方法删除无效的括号:
    • 从左到右遍历字符串,如果遇到一个无效的左括号,则将其删除。
    • 从左到右遍历字符串,如果遇到一个无效的右括号,则将其删除。
  4. 返回删除了无效括号后的字符串。

代码实现

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

总结

这道题主要考察了我们对动态规划的掌握情况。通过这道题,我们可以学习到如何利用动态规划来解决这类问题。此外,这道题还考察了我们的算法思维能力。通过这道题,我们可以学习到如何通过分析字符串的结构来找到解决问题的思路。希望这道题对大家的算法学习有所帮助。