返回

有效括号字符串的判定逻辑与实现

前端

输入:
678. 有效的括号字符串|刷题打卡

参考:

给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

  • 任何左括号 ( 必须有相应的右括号 )。
  • 任何右括号 ) 必须有相应的左括号 ( 。
  • 左括号 ( 必须在对应的右括号之前 )。
    • 可以被视为单个右括号 ) …

输出:

括号字符串的有效性判定是程序设计中常见的问题之一。有效括号字符串是指由左括号 (、右括号 ) 和通配符 * 构成的字符串,且满足以下规则:

  • 任何左括号 ( 必须有相应的右括号 )。
  • 任何右括号 ) 必须有相应的左括号 ( 。
  • 左括号 ( 必须在对应的右括号之前 )。
  • 通配符 * 可以被视为单个右括号 )。

例如,以下字符串是有效的括号字符串:

  • "(())"
  • "(*)("
  • "()"

以下字符串是无效的括号字符串:

  • "(()"
  • "))"
  • ")(*"

为了判定一个括号字符串是否有效,我们可以使用栈数据结构。栈是一种先进后出的数据结构,这意味着后放入栈中的元素将首先被弹出。我们可以将左括号 ( 和通配符 * 压入栈中,当遇到右括号 ) 时,我们将栈顶元素弹出。如果栈顶元素是左括号 (,则括号匹配成功;如果栈顶元素是通配符 *,则通配符可以被视为右括号 ),括号匹配也成功。如果栈为空,则字符串中的所有括号都已匹配成功。

下面是使用栈数据结构判定有效括号字符串的代码示例:

def is_valid_parentheses(s):
    """
    判定一个括号字符串是否有效。

    Args:
        s: 要判定的括号字符串。

    Returns:
        如果字符串有效,返回 True,否则返回 False。
    """

    stack = []
    for char in s:
        if char == '(' or char == '*':
            stack.append(char)
        elif char == ')':
            if not stack:
                return False
            top = stack.pop()
            if top != '(' and top != '*':
                return False

    return not stack

在上面的代码中,我们首先创建一个空栈。然后,我们遍历字符串中的每个字符。如果当前字符是左括号 ( 或通配符 *,则将其压入栈中。如果当前字符是右括号 ),则我们将栈顶元素弹出。如果栈顶元素是左括号 (,则括号匹配成功;如果栈顶元素是通配符 *,则通配符可以被视为右括号 ),括号匹配也成功。如果栈为空,则字符串中的所有括号都已匹配成功。最后,我们检查栈是否为空。如果栈为空,则字符串是有效的,否则字符串无效。

总结

本文介绍了有效括号字符串的判定逻辑与实现。重点讲解了使用栈数据结构解决有效括号字符串判定问题。同时给出了代码示例和详细的解释,帮助读者理解有效括号字符串的判定逻辑。