📜  资质|算术能力3 |问题6(1)

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

资质 | 算术能力3 | 问题6

问题描述

给定一个字符串,其中包含以下四种符号:

  • (:左括号
  • ):右括号
  • {:左花括号
  • }:右花括号

请编写一个函数 isValid 来判断该字符串是否是有效的括号序列。

括号必须按照顺序闭合,例如 ()()(()) 是有效的括号序列,但 (()(())( 不是。

示例
assert isValid("()") == True
assert isValid("()[]{}") == True
assert isValid("(]") == False
assert isValid("([)]") == False
assert isValid("{[]}") == True
解法

这道题可以使用栈来解决。遍历字符串中的每个字符,如果是左括号,则将其压入栈中;如果是右括号,则弹出栈顶元素并判断是否匹配。如果不匹配或者栈为空,则返回 False。最后判断栈是否为空,如果为空,则说明所有括号都匹配成功,返回 True。

代码
def isValid(s: str) -> bool:
    stack = []
    mapping = {")": "(", "}": "{", "]": "["}
    
    for char in s:
        if char in mapping:
            top_element = stack.pop() if stack else "#"
            
            if mapping[char] != top_element:
                return False
        else:
            stack.append(char)
    
    return not stack
复杂度分析
  • 时间复杂度:$O(n)$,其中 $n$ 是字符串的长度。
  • 空间复杂度:$O(n)$,因为栈中的元素最多可以达到 $n$ 个。