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:# 如果栈为空,或者栈顶元素不是对应的左括号,返回falseif not stack or stack[-1] != bracket_map[char]:return Falsestack.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)。在处理括号匹配这类问题时,栈结构是极其高效且直观的选择。它能够自然地处理“后进先出”的特性,完美符合括号匹配的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的异常处理与断路器模式

Java中的异常处理与断路器模式 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在软件开发过程中,异常处理是确保程序稳定性和可靠性的关键部分。J…

2-Protocol Buffer 基础(c++)

本教程提供了使用协议缓冲区的基本介绍。通过逐步创建一个简单的示例应用程序,介绍以下内容: 1.在.proto文件中定义消息格式。 2.使用 protocol buffer 编译器。 3.使用c protocol buffer API来写入和读取消息。 一、问题描述 将要使用的示例是…

Xilinx FPGA:vivado串口输入输出控制fifo中的数据

一、实验要求 实现同步FIFO回环测试,通过串口产生数据,写入到FIFO内部,当检测到按键信号到来,将FIFO里面的数据依次读出。 二、信号流向图 三、状态转换图 四、程序设计 (1)按键消抖模块 timescale 1ns…

python-django-LlamaIndex 精简版

🚀 一键安装LlamaIndex, pip install llama-index 📁 准备你的数据文件,无论是txt还是pdf,放入data文件夹,一切就绪。 🔧 简单几步,在views.py中集成LlamaIndex,代码如…

读书笔记-《魔鬼经济学》

这是一本非常有意思的经济学启蒙书,作者探讨了许多问题,并通过数据找到答案。 我们先来看看作者眼中的“魔鬼经济学”是什么,再选一个贴近我们生活的例子进行阐述。 01 魔鬼经济学 中心思想:假如道德代表人类对世界运转方式的期…

uniapp实现一个键盘功能

前言 因为公司需要&#xff0c;所以我.... 演示 代码 键盘组件代码 <template><view class"keyboard_container"><view class"li" v-for"(item, index) in arr" :key"index" click"changArr(item)" :sty…

初学Spring之 AOP 面向切面编程

AOP&#xff08;Aspect Oriented Programming&#xff09;面向切面编程 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 是面向对象&#xff08;OOP&#xff09;的延续 AOP 在 Spring 中的作用&#xff1a; 1.提供声明式事务 2.允许用户自定义切面 导…

Objects365数据集介绍

Objects365数据集介绍 什么是Objects365数据集&#xff1f;数据集的规模与内容数据集的特点数据集下载 什么是Objects365数据集&#xff1f; Objects365是一个大规模、高质量的物体检测数据集。该数据集旨在推动物体检测技术的发展&#xff0c;特别是在真实世界场景下的应用。O…

Python 学习之机器学习库(九)

Python的机器学习库种类繁多&#xff0c;每个库都有其独特的特性和应用场景。以下是一些主要的Python机器学习库&#xff0c;按照其功能和特点进行清晰归纳和分点表示&#xff1a; 1. NumPy ● 功能&#xff1a;NumPy是Python中用于科学计算的基础库&#xff0c;提供了高性能的…

【python】python当当数据分析可视化聚类支持向量机预测(源码+数据集+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

基于java+springboot+vue实现的校园外卖服务系统(文末源码+Lw)292

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;外卖信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

数据库SQL Server窗口函数、聚合函数

文章目录 窗口函数窗口函数分类窗口函数示例聚合函数示例注意事项 流水表提取最新状态 窗口函数 SQL Server中的窗口函数&#xff08;也称为分析函数&#xff09;是一组非常强大的SQL功能&#xff0c;**它们允许你在结果集的行上执行计算&#xff0c;而不需要将结果集分组为多…

React-tive优质开源项目

对于初学者来说&#xff0c;接触和学习React相关的优质开源项目是一个非常好的方式来提升编程技能&#xff0c;特别是对于理解React的实际应用和最佳实践。这里推荐几个React开源项目&#xff0c;它们通常会附带详细的文档和示例代码&#xff0c;帮助新手快速上手&#xff1a; …

Java中如何实现线程池的生命周期管理

1、创建线程池 使用Executors工厂类或者ThreadPoolExecutor的构造函数来创建线程池。通常&#xff0c;推荐直接使用ThreadPoolExecutor构造函数来明确指定线程池的参数&#xff0c;如核心线程数、最大线程数、空闲线程存活时间、工作队列等。 2、执行任务 通过调用线程池的s…

使用Charles mock服务端响应数据

背景 服务端未提供接口/服务端接口返回结果有逻辑限制&#xff08;次数限制&#xff09;&#xff0c;不能通过原始接口返回多次模拟预期的返回结果&#xff0c;例如边界值情况 客户端受到接口响应数据的限制&#xff0c;无法继续开发或测试&#xff0c;会极大影响开发测试效率…

Perl 数据类型

Perl 数据类型 Perl 是一种功能丰富的编程语言&#xff0c;广泛应用于系统管理、网络编程、GUI 开发等领域。在 Perl 中&#xff0c;数据类型是编程的基础&#xff0c;决定了变量存储信息的方式以及可以对这些信息执行的操作。本文将详细介绍 Perl 中的主要数据类型&#xff0…

QT滑块图片验证程序

使用QT实现滑块验证程序&#xff0c;原理是画个图片&#xff0c;然后在图片上画个空白区域&#xff0c;再画个滑块图片。 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widg…

文心智能体平台快速创建一个HY(Lisp)编程小助手

现在可以在文心智能体平台&#xff0c;使用文心一言创建各种智能体了&#xff01;创建步骤如下&#xff1a; 创建知识库 可以使用本地上传的方式来提交&#xff0c;鼠标移动到”查看模板“&#xff0c;可以下载”知识库外链上传示例模版.xlsx“&#xff0c;按照模板里的格式&…

8.14 矢量图层面要素2.5D渲染

文章目录 前言2.5D渲染QGis设置面符号为2.5D二次开发代码实现2.5D 总结 前言 本章介绍矢量图层面要素2.5D渲染的使用说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 2.5D渲染 2.5D渲染可以将多边形渲染为类3D效果。 QGis设置面符号为2.5D 以"hou…

Swagger的原理及应用详解(十一)

本系列文章简介&#xff1a; 在当今快速发展的软件开发领域&#xff0c;特别是随着微服务架构和前后端分离开发模式的普及&#xff0c;API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;的设计与管理变得愈发重要。一个清晰、准确且易…