📜  门|门CS 2011 |第 59 题(1)

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

门|门CS 2011 第59题

这是一道考察栈的基本操作的题目。题目描述如下:

给你一个字符串序列,请你判断这个序列是否满足以下特征:

  1. 对于任意一个字符是“("、"["、"{",其后一定存在与之匹配的括号。
  2. 任何一对相邻的括号(“()”、"[]"、"{}")不能重叠。
  3. 字符串序列中不包含除"()[]"和"{}"以外的其他字符或空格。

如果符合以上三个条件,返回"True";否则返回"False"。

示例:

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

输入:"([}])" 输出:False

解题思路

可以借助栈的思想,在遍历字符串时对每一个左括号都压入栈中,对于每一个右括号,都弹出栈顶的左括号进行匹配。

具体思路如下:

  1. 创建一个空栈,遍历字符串中的每一个字符。
  2. 如果字符是左括号,将其入栈。
  3. 如果字符是右括号,判断其是否与栈顶的左括号匹配(即是否为一对相邻的括号),如果匹配,则弹出栈顶元素,否则返回False。
  4. 遍历结束后,如果栈为空,则说明符合条件,返回True,否则返回False。

下面是基于Python语言的代码实现:

def is_valid(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:  # 如果该右括号不匹配栈顶元素,则返回False
                return False
        else:  # 如果是左括号,则将其入栈
            stack.append(char)
    return not stack  # 判断栈是否为空,返回结果
总结

本题考察了栈的应用,算法思路简单,但需要注意细节,如空栈时需要设置一个哨兵元素,字典存储括号对应关系等。对于此类括号匹配问题,例如HTML标签的匹配,都可以采用此方法求解。