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;任务…

昇思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”。 手写…

【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…

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

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

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

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

【技巧】如何检查多个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;…

Java知识点整理 12 — 前端 Ant Design Pro 初始化模板使用

一. 项目初始化 Ant Design Pro 是基于 Ant Design 和 umi 封装的一整套企业级中后台前端设计框架&#xff0c;致力于在设计规范和基本组件的基础上&#xff0c;继续向上构建&#xff0c;提炼出典型模板或配套设计资源&#xff0c;进一步提升企业级中后台产品设计研发过程中的…

用MySQL和navicatpremium做一个项目—(财务管理系统)。

1 ER图缩小的话怕你们看不清&#xff0c;所以截了两张图 2 vsdx绘图结果 3DDL和DML,都有点长分了好多次上传&#xff0c;慢慢看 DDL -- 用户表 CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用…

SpringCloud分布式微服务链路追踪方案:Skywalking

一、引言 随着微服务架构的广泛应用&#xff0c;系统的复杂性也随之增加。在这种复杂的系统中&#xff0c;应用通常由多个相互独立的服务组成&#xff0c;每个服务可能分布在不同的主机上。微服务架构虽然提高了系统的灵活性和可扩展性&#xff0c;但也带来了新的挑战&#xf…

vue的学习--day2

如有错误&#xff0c;烦请指正~ 目录 一、什么是单页面应用程序 二、使用工具&#xff1a;node.js 三、工具链 易错点 一、什么是单页面应用程序 多个组件&#xff08;例如登录、注册等以vue结尾的都叫做组件&#xff09;在一个页面显示&#xff0c;叫单页面应用…

【软件测试】白盒测试与接口测试详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是白盒测试 白盒测试是一种测试策略&#xff0c;这种策略允许我们检查程序的内部结构&a…

Vite: Esbuild的使用与其插件开发

概述 作为 Vite 的双引擎之一&#xff0c;Esbuild 在很多关键的构建阶段(如 依赖预编译 、 TS 语法转译 、 代码压缩 ) 让 Vite 获得了相当优异的性能&#xff0c;是 Vite 高性能的得力助手无论是在 Vite 的配置项还是源码实现中&#xff0c;都包含了不少 Esbuild 本身的基本概…

你知道大数据信用分低需要如何改善吗?

在当今社会&#xff0c;大数据信用分已经成为个人信用评估的重要指标之一。然而&#xff0c;有时候我们会发现自己的大数据信用分较低&#xff0c;这可能会对我们的信用状况产生负面影响。那么&#xff0c;如何改善自己的大数据信用分呢?本文将从信用分低的原因进行分析&#…

【Micro-ROS学习】

Micro-ROS 是专为 ROS 2 设计的&#xff0c;它允许在微控制器&#xff08;microcontrollers&#xff09;上实现ROS 2的功能。Micro-ROS 从 ROS 2 架构优化而来&#xff0c;目的是让那些资源有限的嵌入式设备也能够接入ROS 2生态系统&#xff0c;享受ROS 2带来的标准化通信、模块…

java简易计算器(多种方法)

parseDouble() 方法属于 java.lang.Double 类。它接收一个字符串参数&#xff0c;其中包含要转换的数字表示。如果字符串表示一个有效的 double&#xff0c;它将返回一个 double 值。 应用场景 parseDouble() 方法在以下场景中非常有用&#xff1a; 从用户输入中获取数字&a…