📜  | |问题 28(1)

📅  最后修改于: 2023-12-03 15:21:24.640000             🧑  作者: Mango

| |问题 28

介绍

| |问题 28 是一个常见的算法问题,即:给定一个字符串,判断它是否是有效的括号字符串。这意味着该字符串中括号字符必须按正确的顺序出现,比如 ()``[]``{} 等。具体来说,对于每个左括号,都必须有相应的右括号与之匹配,并且两种类型的括号 {}, [], () 不能交叉使用。

解决这个问题的一种常见方法是使用栈。具体而言,我们可以遍历字符串中的每个字符,如果当前字符是左括号,则将其推入栈中;如果当前字符是右括号,则检查栈顶的左括号是否与之匹配。如果匹配,则出栈,否则字符串不是有效的括号字符串。如果在遍历完整个字符串后,栈中仍有元素,则字符串不是有效的括号字符串。

示例

输入: "()[]{}" 输出: true

输入: "([)]" 输出: false

输入: "{[]}" 输出: true

代码

以下是使用 Python 解决此问题的示例代码:

class Solution:
    def isValid(self, s: str) -> bool:
        match = {')': '(', '}': '{', ']': '['}
        stack = []
        for c in s:
            if c in match:
                if not stack or stack.pop() != match[c]:
                    return False
            else:
                stack.append(c)
        return not stack
复杂度分析

时间复杂度:$O(n)$,其中 $n$ 是字符串的长度。遍历字符串一遍,并在栈上进行 $O(1)$ 的推入和弹出操作。

空间复杂度:$O(n)$。在最坏情况下,栈中可能需要存储所有字符串中的元素。