LeetCode.32最长有效括号详解

问题描述

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

解题思路1

有效的括号字符串意味着每一个左括号 '(' 都可以找到一个相匹配的右括号 ')'。栈可以帮助我们追踪尚未匹配的括号,并有效地处理嵌套结构。

解题步骤如下:

  1. 初始化一个栈,并将一个特殊的索引 -1 压入栈。这一步是为了方便计算最长有效子串的长度。
  2. 遍历字符串的每个字符:
    • 如果字符是 '(',将其索引压入栈。
    • 如果字符是 ')':
      • 弹出栈顶元素(这代表最近的一个 '(' 已经被匹配)。
      • 如果栈为空,说明没有 '(' 可以与当前的 ')' 匹配,将当前的索引压入栈作为新的起点。
      • 如果栈不为空,当前索引减去栈顶元素索引即为有效子串的长度,更新最长有效长度。
  3. 返回最长有效长度

代码实现:

class Solution {
public:int longestValidParentheses(string s) {int maxLength = 0;stack<int> indexStack;indexStack.push(-1); // 前一个没有匹配的 ')' 的位置for (int i = 0; i < s.length(); i++) {if (s[i] == '(') {// 将 '(' 的索引入栈indexStack.push(i);} else {// 弹出栈顶元素indexStack.pop();if (indexStack.empty()) {// 如果栈为空,意味着没有 '(' 可以与当前 ')' 匹配indexStack.push(i); // 当前位置变为最后一个没有匹配的 ')'} else {// 栈不为空,则计算有效长度int validLength = i - indexStack.top();maxLength = max(maxLength, validLength);}}}return maxLength;}
};

这个解题思路主要参考了逆波兰表示法这个知识点。

解题思路2

第二种方法效率更高,但思路没有上面第一种思路清晰。

使用两个计数器

我们采用两个计数器(leftright)来分别跟踪左括号和右括号的数量。这种方法的关键在于通过两次遍历字符串来确保所有的括号都能找到对应的匹配,从而计算出最长的有效括号子串。

第一次遍历:从左到右

在第一次遍历中,我们从字符串的开始到结束进行扫描:

  • 遇到 '(' 时,增加 left 计数器。
  • 遇到 ')' 时,增加 right 计数器。
  • 每当 leftright 数量相等时,我们更新最长有效子串的长度,这是因为到目前为止,所有遇到的括号都能完全匹配。
  • 如果 right 的数量超过 left,这表明括号已经无法匹配,需要重置两个计数器。这是因为任何以 ')' 开始的子串都不可能是有效的。
第二次遍历:从右到左

第二次遍历与第一次遍历类似,但方向相反。这主要是为了捕捉那些在第一次遍历中由于左括号过多而未能正确处理的情况:

  • 遇到 ')' 时,增加 right 计数器。
  • 遇到 '(' 时,增加 left 计数器。
  • leftright 数量相等时,同样更新最长有效子串的长度。
  • 如果 left 数量超过 right,则重置两个计数器,因为任何以 '(' 结尾的子串都不能是有效的。

代码实现:

class Solution {
public:int longestValidParentheses(string s) {int left = 0, right = 0, maxLength = 0;// 第一次遍历:从左到右for (int i = 0; i < s.length(); ++i) {if (s[i] == '(') {left++;} else {right++;}if (left == right) {maxLength = max(maxLength, 2 * right);} else if (right > left) {left = 0;right = 0;}}left = 0;right = 0;// 第二次遍历:从右到左for (int i = s.length() - 1; i >= 0; --i) {if (s[i] == ')') {right++;} else {left++;}if (left == right) {maxLength = max(maxLength, 2 * left);} else if (left > right) {left = 0;right = 0;}}return maxLength;}
};

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

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

相关文章

Micro-ROS是什么?

Micro-ROS是ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;生态系统的一个重要组成部分&#xff0c;专为微控制器&#xff08;Microcontrollers&#xff09;设计的轻量级ROS版本。它的目标是在资源有限的嵌入式平台上实现ROS 2的功能&#xff0…

RocketMQ:日常开发中有哪些使用MQ的场景

什么是消息队列&#xff1f; 消息队列是一种通信方法&#xff0c;允许应用程序通过发送和接收消息来互相通信。这些消息/任务/指令存储在一个中间介质中&#xff08;即队列&#xff09;&#xff0c;并由生产者发送&#xff0c;消费者接收。 使用场景 场景一&#xff1a;任务…

对于使用 C 语言开发的跨平台应用,如何解决不同操作系统和硬件架构带来的底层差异和兼容性问题?

在使用C语言开发跨平台应用时&#xff0c;可以采取以下方法来解决不同操作系统和硬件架构带来的底层差异和兼容性问题&#xff1a; 使用平台无关的标准库&#xff1a;使用C语言标准库提供的函数和数据类型&#xff0c;避免直接使用操作系统特定的函数和数据类型。 使用条件编译…

昇思25天学习打卡营第1天|基本介绍

MindSpore 基本介绍设计理念层次结构 基本介绍 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 易开发&#xff1a;API友好、调试难度低高效执行&#xff1a;包括计算效率、数据预处理效率和分布式训练效率全场景&am…

手写SpringMVC之ApplicationContextListener

什么是Spring MVC&#xff1f; Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08; spring-webmvc &#xff09;&#xff0c;但它通常被称为“Spring MVC”。 手写…

hive-LEAD() over() 取字段的下一个值

lead(status,1,null) over(partition by shop oreder by month) as next_status --lead()参数1&#xff1a;目标字段;参数2&#xff1a;步长&#xff08;是取下1个还是下2个&#xff09;;参数3&#xff1a;取不到给NULL SELECTa.related_org_code,a.camera_id,a.event_ti…

【elasticsearch】es6重启服务后数据消失,es6如何配置数据持久化储存

服务器重启后之前添加进去的数据消失了,排查了一圈发现数据没有进行持久化保存导致的 在Elasticsearch 6.0.0中,数据的持久化存储主要通过以下几个配置来实现: 1、path.data: 指定Elasticsearch用于存储数据的目录。 2、path.logs: 指定Elasticsearch日志文件存储的目录。 …

【python】OpenCV—Color Map

文章目录 cv2.applyColorMapcv2.putText小试牛刀自定义颜色 参考学习来自 OpenCV基础&#xff08;21&#xff09;使用 OpenCV 中的applyColorMap实现伪着色 cv2.applyColorMap cv2.applyColorMap() 是 OpenCV 中的一个函数&#xff0c;用于将灰度图像或单通道图像应用一个颜色…

The First Descendant卡顿怎么办?快速处理第一后裔卡顿

第一后裔/The First Descendant是一款刷宝类RPG射击游戏&#xff0c;以虚幻引擎5为基础&#xff0c;使其对决场景十分精彩、刺激&#xff0c;从而吸引了大批冒险者前往&#xff0c;这里揭开属于英格里斯和继承者的秘密。不过有很多玩家&#xff0c;反馈在对局时遇到了卡顿、画面…

Ubuntu 20.04.3 LTS 安装打印服务器 局域网发现系统服务 共享给 windows 10/11 使用

ubuntu安装部署打印服务器可参考: Ubuntu 20.04.3 LTS 安装hp 1020 plus 打印机 通过cups共享给 windows 10/11 使用-CSDN博客 1 windows 10 ,局域网搜索不到共享的hp1020打印机 2 Ubuntu使用Avahi进行局域网服务发现和设备发现&#xff0c;安装avahi-daemon sudo apt-updat…

计算机的核心、线程、进程,任务、指令,他们之间的关系及工作原理

一、基本概念 1&#xff09;指令的含义及组成 定义&#xff1a;指令是计算机程序发给处理器的命令&#xff0c;它是计算机硬件语言系统&#xff08;机器语言&#xff09;的一部分&#xff0c;用来指挥CPU执行特定的操作。内容&#xff1a;一条指令通常包括操作码和地址码。操…

【Linux】Linux下使用套接字进行网络编程

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 用于网络应用开…

DNS自动择优:提升网络体验的新途径

随着互联网的深入发展和广泛应用&#xff0c;网络速度和网络稳定性成为了用户关注的重点。在这个过程中&#xff0c;DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;的作用不容忽视。近年来&#xff0c;DNS自动择优技术的出现&#xff0c;为提升网络体验带…

Java基础(四)——字符串、StringBuffer、StringBuilder、StringJoiner

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

git pull 参与别人的项目

简述 git pull主要是实现本地项目的上推。主要用在将本地更改提交到 GitHub 上别人的项目&#xff08;即在线原始项目&#xff09;。以下是基本操作逻辑&#xff1a; Fork 原始项目&#xff1a;在 GitHub 上 fork 原始项目到个人账户。克隆 Fork 的项目&#xff1a;将 fork 的…

磁力链接搜索大全教程,如何使用磁力链接。

磁力链接是一种特殊的下载链接&#xff0c;磁力链接可以理解为一个文件识别码&#xff0c;而并非具体的资源地址&#xff0c;下载软件需要拿着这个识别码去整个互联网(DHT网络)去寻找持有该资源的用户(节点)&#xff0c;如果找到则可以进行传输下载。一般年代越久远的磁力链接下…

6、广告-RTB竞价逻辑

在程序化广告中&#xff0c;技术的应用至关重要&#xff0c;尤其是RTB&#xff08;实时竞价&#xff09;的竞价逻辑。以下详细介绍RTB竞价逻辑&#xff0c;并提供相关的中文名词与英文名词对应。 一、RTB竞价逻辑&#xff08;Real-Time Bidding Logic&#xff09; RTB是程序化…

【技巧】如何检查多个GPU之间是否支持P2P通信

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 需要用到cuda_samples&#xff1a;GitHub - NVIDIA/cuda-samples 该工具的详细解释可以看这个&#xff1a; 【知识】详细介绍 CUDA Samples 示例工程…

不止是只有维度建模,数据仓库还有Data Vault建模

引言 在数据仓库设计中&#xff0c;传统的星型和雪花型模型有着各自的优势和劣势。随着数据量的增大和数据源的多样化&#xff0c;Data Vault&#xff08;数据仓库&#xff09;建模方法逐渐受到关注和应用。Data Vault建模是一种灵活、可扩展、适应性强的建模方法&#xff0c;…

LVS+Keepalived 高可用集群搭建实验

192.168.40.204lvs+keepalivedlvs-k1192.168.40.140lvs+keepalivedlvs-k2192.168.40.150nginx官方教程web-1192.168.40.151nginxepel阿里云源web-2Woo79 | LVS+Keepalived 高可用集群搭建 (图文详解小白易懂) 第一步:负载均衡高可用 1.在lvs-k1和lvs-k2上面安装keepalived…