当前位置: 首页 > news >正文

LeetCode:有效的括号

基本思路为:利用栈和映射字典,遇到左括号入栈,遇到右括号时检查栈顶元素是否匹配,若不匹配则返回 False,最后检查栈是否为空来确定字符串是否有效。

首先,创建一个空栈存储左括号;

创建一个映射字典,键为左括号,值为对应的右括号;

遍历字符,如果当前字符是左括号就压入栈中;如果是右括号,如果栈是空的则返回False;弹出栈顶元素,如果此元素对应的和char不一样,返回False;

遍历结束后若栈为空,说明所有的左括号都匹配右括号,返回True。

此代码运行效率中等,在LeetCode中属于中等水平:

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        # 初始化一个空栈,用于存储左括号
        stack = []
        # 创建一个映射字典,键为左括号,值为对应的右括号
        mapping = {"(": ")", "[": "]", "{": "}"}

        # 遍历输入字符串中的每个字符
        for char in s:
            # 如果当前字符是左括号
            if char in mapping:
                # 直接将左括号压入栈中
                stack.append(char)
            else:
                # 如果当前字符是右括号
                if not stack:
                    # 若栈为空,说明没有对应的左括号,返回 False
                    return False
                # 弹出栈顶元素
                top_element = stack.pop()
                # 检查栈顶元素对应的右括号是否和当前字符相等
                if mapping[top_element] != char:
                    return False

        # 遍历结束后,若栈为空,说明所有左括号都有匹配的右括号,返回 True;否则返回 False
        return len(stack) == 0
    

大佬做法:

class Solution:
    def isValid(self, s: str) -> bool:
        # 如果字符串长度为奇数,那么必然存在一个括号无法匹配,直接返回 False
        if len(s) % 2 == 1:
            return False
        
        # 定义一个字典,键为右括号,值为对应的左括号,用于后续匹配检查
        pairs = {
            ")": "(",
            "]": "[",
            "}": "{",
        }
        # 初始化一个空列表作为栈,用于存储遍历过程中遇到的左括号
        stack = list()
        # 遍历输入字符串中的每个字符
        for ch in s:
            # 如果当前字符是右括号
            if ch in pairs:
                # 如果栈为空,说明没有对应的左括号;或者栈顶元素与当前右括号对应的左括号不匹配
                # 则说明括号序列无效,返回 False
                if not stack or stack[-1] != pairs[ch]:
                    return False
                # 若匹配成功,弹出栈顶元素
                stack.pop()
            else:
                # 如果当前字符是左括号,将其压入栈中
                stack.append(ch)
        
        # 遍历结束后,如果栈为空,说明所有左括号都找到了对应的右括号,返回 True
        # 否则返回 False
        return not stack

相关文章:

  • mysql镜像创建docker容器,及其可能遇到的问题
  • 远程监控系统项目里练习
  • 分享一个可以跨平台进行等保核查的脚本
  • 记录一次家里宽带 被修改带宽维权的事情
  • Design Compiler:语法检查工具dcprocheck
  • mapbox基础,加载ESRI OpenStreetMap开放街景标准风格矢量图
  • C++中常见函数
  • 算法进阶指南 分形
  • Java垃圾回收的隐性杀手:过早晋升的识别与优化实战
  • 「合诚」携手企企通共建新材料和健康产业采购数智化新生态
  • rqlite:一个基于SQLite构建的分布式数据库
  • MySQL数据库应用技术试卷
  • main函数参数
  • PyTorch 深度学习 || 6. Transformer | Ch6.2 注意力机制
  • 使用PX4,gazebo,mavros为旋翼添加下视的相机(仿真采集openrealm数据集-第一步)
  • Java 通过 JNI 调用 C++ 动态库的完整流程
  • 获客系统 V2
  • AI一周事件(2025年3月31日至4月7日)
  • 汇丰eee2
  • LDAP高效数据同步:Syncrepl复制模式实战指南
  • 一生要出片的年轻人,买爆相机
  • 婚姻登记“全国通办”首日观察:数据多跑路,群众少跑腿
  • 2025年度上海市住房城乡建设管理委工程系列中级职称评审工作启动
  • 壹基金发布2024年度报告,公益项目惠及937万人次
  • 夜读丨母亲的手擀面
  • 公募基金改革八大要点:建立浮动管理费收取机制、降低规模排名考核权重