• 力扣.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)
  • 相关阅读:
    SpringMVC(五):获取请求参数
    飞行机器人专栏(八)-- AGX Xavier 通信、控制及视觉应用开发
    提升网络训练的准确率
    LeetCode --- 1523. Count Odd Numbers in an Interval Range 解题报告
    测试需求分析
    安卓逆向(二)httpClient使用
    webrtc安全性 加密方式
    Java 监控直播流rtsp协议转rtmp、hls、httpflv协议返回浏览器
    【vue】下载导出excel
    如何用快解析自制IoT云平台
  • 原文地址:https://blog.csdn.net/2301_77160836/article/details/134521723