Python面试宝典第6题:有效的括号

题目

        给定一个只包括 '('、')'、'{'、'}'、'['、']' 这些字符的字符串,判断该字符串是否有效。有效字符串需要满足以下的条件。

        1、左括号必须用相同类型的右括号闭合。

        2、左括号必须以正确的顺序闭合。

        3、每个右括号都有一个对应的相同类型的左括号。

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

        示例 1:

输入: "([])"
输出: true

        示例 2:

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

        示例 3:

输入: "(]"
输出: false

        示例 4:

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

递归法

        本题可以采用递归的方式来解决,递归的基本思想是不断地将问题分解为更小的子问题。对于当前的字符串,如果它是有效括号字符串,那么它要么为空,要么可以分为两部分:第一个部分包含一个左括号、一个有效括号字符串、一个对应的右括号,第二部分包含另一个有效括号字符串(如果存在的话)。通过这种方式,我们可以递归地检查字符串的每一部分是否有效。使用递归法求解本题的主要步骤如下。

        1、如果字符串为空,直接返回true,因为空字符串视为有效。

        2、如果字符串长度为奇数,直接返回false,因为有效的括号字符串长度必须是偶数。

        3、从字符串的第一个字符开始,找到第一个闭合的括号对(即左括号和其对应的右括号)。如果找不到成对的括号,说明字符串无效,返回false。

        4、将字符串分割为两部分:中间的有效括号对、右边的子字符串(从找到的右括号之后的部分)。

        5、递归地检查子字符串是否有效,如果都有效,则整个字符串有效。否则,无效。

        注意:虽然递归法在理论上可行,但它在处理长字符串时,可能会导致调用栈溢出。递归法更多地是作为一种算法思维的展示,帮助理解问题的分解过程,故这里就不给出具体的源码实现了。

栈方法

        对于括号匹配问题,最直观的方法是使用栈数据结构来解决。首先遍历整个字符串,每次遇到左括号时,将其压入栈中。每次遇到右括号时,检查栈顶元素是否为对应的左括号。如果是,则弹出栈顶元素,继续遍历。如果不是,则直接判定该字符串无效。遍历结束后,如果栈为空,则说明所有括号都已正确匹配。使用栈方法求解本题的主要步骤如下。

        1、初始化一个空栈。

        2、遍历字符串中的每一个字符,做如下判断。

        (1)如果字符是'('、'{' 、'[',将其压入栈中。

        (2)如果字符是')'、'}' 、']',检查栈顶元素是否为其对应的左括号。如果是,弹出栈顶元素。如果不是,直接返回false。

        3、遍历完成后,检查栈是否为空。为空则返回true,表示所有括号都已正确匹配。不为空则返回false,表示存在未匹配的括号。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def is_valid_brackets(s: str) -> bool:
    bracket_map = {")": "(", "}": "{", "]": "["}
    stack = []
    
    for char in s:
        if char in bracket_map:
            # 如果栈为空,或者栈顶元素不是对应的左括号,返回false
            if not stack or stack[-1] != bracket_map[char]:
                return False
            stack.pop()  # 匹配成功,弹出栈顶元素
        else:
            # 左括号直接入栈
            stack.append(char)
    
    return not stack  # 栈为空则返回true,表示所有括号都已正确匹配

# 输出:True
print(is_valid_brackets("([])"))
# 输出:True
print(is_valid_brackets("()[]{}"))
# 输出:False
print(is_valid_brackets("(]"))
# 输出:False
print(is_valid_brackets("([)]"))

总结

        使用栈结构处理括号匹配问题的时间复杂度是O(n),空间复杂度也是O(n)。在处理括号匹配这类问题时,栈结构是极其高效且直观的选择。它能够自然地处理“后进先出”的特性,完美符合括号匹配的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/773216.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

九浅一深Jemalloc5.3.0 -- ⑨浅*gc

目前市面上有不少分析Jemalloc老版本的博文,但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同,本着“与时俱进”、“由浅入深”的宗旨,我将逐步分析Jemalloc5.3.0的实现。 另外,单讲实现代码是极其枯燥的,…

拆解COLA框架

COLA 是 Clean Object-Oriented and Layered Architecture的缩写,代表“整洁面向对象分层架构”。由阿里大佬张建飞所提出的一种基于DDD和代码整洁理论所诞生的实践理论框架,详细内容可阅读《程序员的底层思维》和相关git代码去了解 项目地址&#xff1a…

在地图上根据经纬度,画一个矩型围栏,设置每个点的经纬度

在做一个需求时有一个小点就是添加一个配送区域(5公里直径内的)矩形围栏 我做的比较简单 大家看看有没有帮助, 也是精简代码。测试效果上相对是精准的 //谷歌,根据经纬度获取以它为中心半径为5公里内的矩形的四个点经纬度getDefalutPoints (lng: number, lat: num…

lt6911UXC 国产原装 高性能HDMI2.0转MIPI DSI / CSI芯片方案 提供LT 开发资料包及在线软硬件技术支持!

1.说明 LT6911UXC是一款高性能HDMI2.0到MIPI DSI / CSI转换器,用于VR,智能电话,显示应用。 HDMI2.0输入支持高达6Gbps的数据速率,从而为4k 60Hz视频提供足够的带宽。还支持HDCP2.2进行数据解密。 对于MIPI DSI / CSI输出&#xf…

企业数据API平台:获取企业多维度信息

数据API平台是指提供一系列预先定义的接口、协议与工具,允许不同应用程序或系统之间进行数据交换和通信的平台。这些接口被称为数据API(Data Application Programming Interface),是数据管理系统或应用程序提供的一组开放式接口。…

Linux手动安装JDK1.8

1、下载要安装的jdk安装包文件 官网下载地址:https://www.oracle.com/cn/java/technologies/downloads/ 2、上传jdk安装包至要安装服务器 3、在要安装jdk位置使用命令解压安装包 安装路径: /usr/local/java 解压安装包,解压命令 tar -zxvf /install…

【博客21】缤果Qt5仿小米耳机APP布局_PC端软件(高级篇)

小米耳机 备注:此软件只是简单的实现布局和界面跳转逻辑, 并未加入小米协议相关内容,因需要鉴权方式验证,故无法进行通讯编程. 开发工具: qt-opensource-windows-x86-5.14.2 (编程语言C) Android反编译工具: apktool 小米小爱开放平台 - 语音服务平台 - 文档中…

3-1 激活函数和神经网络思想

3-1 激活函数和神经网络思想 主目录点这里

android应用的持续构建CI(四)-- 依赖环境(兼容多版本的gradle和jdk)

一、背景 android应用的构建前提是,安装好了gradle和jdk。在实际使用的过程中,不同的android应用,对gradle和jdk的版本要求不一。 于是,在jenkins服务器上,我们需要安装多种版本的gradle和jdk。 安装过jdk的小伙伴应…

Jenkins 使用 Publish over SSH进行远程访问

Publish over SSH 是 Jenkins 的一个插件,可以让你通过 SSH 将构建产物分发到远程服务器。以下是如何开启 Publish over SSH 的步骤: 一、安装 Publish over SSH 插件 在 Jenkins 中,进入 "Manage Jenkins" > "Manage Plugins"。选择 "Availab…

【spring MVC的执行流程】

SpringMVC可以说是Servlet的封装,屏蔽了Servlet的很多细节,比如Servlet再获取参数的时候需要不停地getParameter,现在只要在SpringMVC方法定义对应的JavaBean,只要属性和参数名一致,SpringMVC就可以帮我们实现将参数封装到JavaBea…

基础扫盲:js作用域及其优先级,有示例代码。

在 JavaScript 中,作用域指的是变量和函数的可访问性和可见性。 JavaScript 中的作用域有以下几种: 1. 全局作用域(Global Scope):全局作用域是指在代码中任何地方都可以访问的作用域。在全局作用域中声明的变量和函数…

DFS之连通性模型——AcWing 1112. 迷宫

DFS之连通性模型 定义 DFS(深度优先搜索,Depth-First Search)之连通性模型主要用于图论问题中判断图的连通性,即确定图中的所有节点是否可以通过边相互到达。 DFS(深度优先搜索,Depth-First Search&…

深度学习——深度学习中感受野的计算

感受野 在卷积神经网络(CNN)中,感受野(Receptive Field) 是一个非常重要的概念。它描述了网络中某一层的输出(通常是特征图上的一个像素点)所对应的输入图像上的空间范围。这个范围代表了该输出…

Jelly Merge | Template + Editor(休闲益智游戏包)

Jelly Merge是Watermelon Games开发的一款完整游戏。 这款完全可定制的益智游戏具有简单但超级有趣的游戏玩法。 您下一次成功的完美起点! 我们的优势 🧑🏻‍💻 不和谐支持 🗃️ 详细文档 🛠️易于使用的工…

C# WPF 3D 数据孪生 系列六

数字孪生应用开发 应用开发中的布局需求 Grid基本使用 WPF 3D绘图 点云 系列五-CSDN博客 WPF UI 3D 多轴 机械臂 stl 模型UI交互-CSDN博客 WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三-CSDN博客 数字孪生 介…

【堆 优先队列】23. 合并 K 个升序链表

本文涉及知识点 堆 优先队列 LeetCode23. 合并 K 个升序链表 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists [[1,4,5],[1,3,4],[2,6]] 输出&#…

本地Windows电脑 连接 Windows 服务器

Windows电脑 连接 Windows 服务器 方式1:直接搜索 在电脑的搜索栏,输入“远程桌面连接” 可以选择点击 “打开” 或者直接按 回车键 “Enter”,打开 远程桌面连接 方式2:运行框打开服务器连接 同时按:Windows徽标键…

【BUUCTF-PWN】10-bjdctf_2020_babystack

简单的栈溢出,ret2text 64位,开启了NX保护 执行效果: main函数: 因为读入的字符长度可以由用户输入的第一个参数值决定,因此read函数存在栈溢出 覆盖距离为0x108 存在后门函数: 后门函数地址0x4…

Vulnhub靶场DC-5练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 利用burpsuite爆破文件包含的参数2. 文件包含3. nginx日志挂马4. 反弹shell5.漏洞利用和提权 0x04 总结 0x00 准备 下载链接:https://download.vulnhub.com/dc/DC-5.zip 介绍: …