📜  数据结构 |堆栈 |问题2(1)

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

数据结构 | 堆栈 | 问题2

问题描述

给定一个字符串,包括 "(",")","{","}","[","]" ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

解决方法

这是一个典型的栈的应用场景。我们可以利用栈来存储左括号,每当遇到一个右括号,就去栈中查找它对应的左括号是否存在,如果存在,则将其弹出,否则判定为非法字符串。

具体的实现过程如下:

  1. 定义栈 stack,并初始化为空。
  2. 遍历字符串中的每一个字符:
    1. 如果是左括号,将其压入栈中。
    2. 如果是右括号,查看栈顶元素是否是与之匹配的左括号,如果匹配,则将栈顶元素弹出,否则判定为非法字符串。
  3. 遍历完字符串后,如果栈 stack 为空,则字符串合法,否则非法。

实现代码如下:

def isValid(s: str) -> bool:
    stack = []
    pairs = {")": "(", "}": "{", "]": "["}
    for char in s:
        if char in pairs.values():
            stack.append(char)
        elif char in pairs.keys():
            if len(stack) == 0 or stack[-1] != pairs[char]:
                return False
            stack.pop(-1)
    return len(stack) == 0

代码解释:

  1. 定义一个栈 stack 和一个字典 pairs,字典中存储右括号和其对应的左括号。
  2. 遍历字符串 s 中的每个字符 char
    1. 如果 char 是左括号,将其压入栈 stack 中。
    2. 如果 char 是右括号,查看栈 stack 的栈顶元素是否是与之匹配的左括号,如果匹配,则将栈顶元素弹出。
  3. 遍历完字符串后,如果栈 stack 为空,则字符串合法,否则非法。
总结

通过栈来实现字符串的合法性判断,可以很好地利用栈的后进先出特点,完成左右括号的匹配,从而实现高效的字符串判断。