• 力扣.20. 有效的括号(栈的括号匹配问题)


    题目:

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

    有效字符串需满足:

    • 左括号必须用相同类型的右括号闭合。
    • 左括号必须以正确的顺序闭合。
    • 注意空字符串可被认为是有效字符串。

    示例 1:

    • 输入: "()"
    • 输出: true

    示例 2:

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

    示例 3:

    • 输入: "(]"
    • 输出: false

    示例 4:

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

    示例 5:

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

     思路:

    括号匹配是使用栈解决的经典问题,建议写代码的时候尽量把栈的构造给写出来(力扣上没有)

    该问题会遇到三种三种不匹配的情况:

    1.第一种情况,字符串里左方向的括号多余了 ,所以不匹配。 如:([]()

    2.第二种情况,括号没有多余,但是括号的类型没有匹配上。 如:({[}})

    3.第三种情况,字符串里右方向的括号多余了,所以不匹配。 如: ({})))

    但还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!

    代码实现:

    1. class Solution:
    2. def isValid(self, s: str) -> bool:
    3. stack = Stack() # 创建一个栈对象
    4. for ch in s:
    5. if ch == '(': # 如果字符为左括号,将对应的右括号入栈
    6. stack.push(')')
    7. elif ch == '[':
    8. stack.push(']')
    9. elif ch == '{':
    10. stack.push('}')
    11. elif stack.isEmpty() or stack.pop() != ch: # 如果栈为空或栈顶元素与当前字符不匹配,返回 False
    12. return False
    13. else:
    14. stack.pop() # 对于右括号字符,应该进行出栈操作,但是当前代码没有实际执行出栈操作,需要修改
    15. return stack.isEmpty() # 遍历完字符串后,栈应为空,否则左括号多余,返回 False
    16. class Stack:
    17. def __init__(self):
    18. self.stack = [] # 初始化一个空列表作为栈的数据存储结构
    19. def isEmpty(self):
    20. """
    21. 判断栈是否为空
    22. :return: True(为空)/False(不为空)
    23. """
    24. return len(self.stack) == 0
    25. def push(self, item):
    26. """
    27. 入栈操作
    28. :param item: 入栈元素
    29. """
    30. self.stack.append(item) # 将元素添加到栈顶
    31. def pop(self):
    32. """
    33. 出栈操作
    34. :return: 出栈元素,如果栈为空则返回 False
    35. """
    36. if self.isEmpty(): # 判断栈是否为空
    37. return False
    38. else:
    39. return self.stack.pop() # 将栈顶元素删除并返回

    复杂度分析: 

    • 时间复杂度: O(n)
    • 空间复杂度: O(n)
  • 相关阅读:
    leetcode_力扣_面试题 17.19. 消失的两个数字
    Qt控件设置Icon
    有没有可以大量注册虾皮买家号的软件
    解锁数据潜能:构建高效数据仓库的策略与实践
    SpringBoot使用随机端口启动
    Java锁
    C++使用TinyXml(开源库)读取*.XMl文件
    TI Sitara系列 AM64x开发板——FreeRTOS、Baremetal案例开发案例
    面试被问:Mysql的InnoDB下RR是如何解决幻读问题的
    一款WPF的精简版MVVM框架——stylet框架的初体验(包括MVVM绑定、依赖注入等操作)
  • 原文地址:https://blog.csdn.net/2301_77160836/article/details/134521723