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.mfbz.cn/a/740556.html

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

相关文章

推荐一款AI修图工具,支持AI去水印,AI重绘,AI抠图...

不知道大家有没有这样的一个痛点&#xff0c;发现了一张不错的“素材”&#xff0c; 但是有水印&#xff0c;因此不能采用&#xff0c;但找来找去&#xff0c;还是觉得初见的那个素材不错&#xff0c;怎么办&#xff1f; 自己先办法呗。 二师兄发现了一款功能强大的AI修图工具…

猫头虎 AI 前沿科技探索之路(持续更新):ChatGPT/GPT-4 科研应用、论文写作、数据分析与 AI 绘图及文生视频实战全攻略

猫头虎 AI 前沿科技探索之路(持续更新)&#xff1a;ChatGPT/GPT-4 科研应用、论文写作、数据分析与 AI 绘图及文生视频实战全攻略 背景介绍 随着人工智能技术的飞速发展&#xff0c;AI 的应用已经渗透到各个领域&#xff0c;从商业决策到医疗健康&#xff0c;再到日常生活中的…

win10改远程桌面端口,Windows 10 修改远程桌面端口号的专业指南

在Windows 10系统中&#xff0c;远程桌面&#xff08;Remote Desktop&#xff09;功能允许用户从一台计算机远程访问和控制另一台计算机。为了增加远程连接的安全性&#xff0c;减少潜在的安全风险&#xff0c;修改默认的远程桌面端口号是一个常见的安全措施。以下是在Windows …

postman教程-22-Newman结合Jenkins执行自动化测试

上一小节我们学习了Postman Newman运行集合生成测试报告的方法&#xff0c;本小节我们讲解一下Postman Newman结合Jenkins执行自动化测试的方法。 在软件开发过程中&#xff0c;持续集成&#xff08;CI&#xff09;是一种实践&#xff0c;旨在通过自动化的测试和构建过程来频繁…

离散数学-再次复习

1.先找到e&#xff0c;这里是0 2.对每个元素求它的阶 3.根据拉格朗日定理&#xff0c;子群的阶必须是群 G 的阶的因数。群 G 的阶为 10&#xff0c;它的因数有 1、2、5 和 10。这意味着子群的阶可能是 1、2、5 或者 10。 4.相同阶的就放为一组&#xff0c;也就是它的一个子群…

华为开发者大会闪耀东莞,康佳电视携手海思惊艳亮相

近日&#xff0c;华为开发者大会&#xff08;HDC2024&#xff09;在东莞松山湖举行。 作为电视领域唯一受邀参展的品牌&#xff0c;康佳电视以其优秀的创新实力&#xff0c;携手华为海思共同展示了基于OpenHarmony Standard层级的鸿鹄媒体创新方案。该方案不仅能够为用户带来更…

uni-starter:云端一体应用快速开发的新选择

一、引言 随着移动互联网的快速发展&#xff0c;应用开发面临着日益增长的效率挑战。如何在保证应用功能丰富性的同时&#xff0c;快速迭代和上线&#xff0c;成为了众多开发者关注的焦点。在这样的背景下&#xff0c;uni-starter作为一款集成商用项目常见功能的云端一体应用快…

大型语言模型(LLM)和多模态大型语言模型(MLLM)的越狱攻击

随着大型语言模型&#xff08;LLMs&#xff09;的快速发展&#xff0c;它们在各种任务上表现出了卓越的性能&#xff0c;有效地遵循指令以满足多样化的用户需求。然而&#xff0c;随着这些模型遵循指令的能力不断提升&#xff0c;它们也越来越成为对抗性攻击的目标&#xff0c;…

ONLYOFFICE 桌面编辑器 8.1:全新升级,助您轻松高效处理办公文档

ONLYOFFICE 桌面编辑器 一、前言二、轻松编辑器 PDF 文件三、用幻灯片版式快速修改幻灯片四、无缝切换文档编辑、审阅和查看模式五、改进从右至左语言的支持 & 新的本地化选项六、版本 8.1&#xff1a;其他新功能七、ONLYOFFICE 官网&#xff1a;https://www.onlyoffice.co…

msvcp120.dll丢失的解决方法,总结几种有效的解决方法

最近&#xff0c;我在使用计算机时遇到了一个问题&#xff0c;系统提示我丢失了msvcp120.dll文件。这让我感到非常困扰&#xff0c;因为这个问题导致我无法正常运行一些程序。经过一番搜索和尝试&#xff0c;我找到了几种修复这个问题的方法&#xff0c;并成功解决了这个问题。…

Unity面试题 UGUI调整UI与粒子特效的显示层级

首先&#xff0c;必须保证Canvas画布的渲染模式为了相机渲染 方法:一&#xff1a;将需要控制UI显示层级的Image换成Sprite 1.创建一个粒子系统&#xff0c;和两张Sprite. 2.设置Sprite1的Order in Layer为 -1&#xff0c;设置Sprite2的Order in Layer为 1&#xff0c;粒子的Ord…

QT拖放事件之一:初识拖放4大事件处理函数

1、拖放的前提 // 为了产生拖放事件,必须同时具备以下两个条件: // [1.] 必须开启用来接受拖放的窗口,否则无法产生拖放事件,鼠标形状显示为禁用标志; // [2.] 必须重写重新实现dragEnterEvent() {event->accept(); 或 event->acceptProposedAction();}; // 否则,…

VoxEdit 竞赛|为 The Sandbox 土地持有者设计专属奖励资产

邀请大家参与这场精彩的 VoxEdit 竞赛&#xff0c;在元宇宙中发挥你的创造力&#xff0c;并将你的体素技能提升到新的水平&#xff01; 按此下载 VoxEdit &#xff01; https://www.sandbox.game/en/create/vox-edit/ 比赛主题&#xff1a;建筑与古迹 一起潜入建筑和古迹的世…

NetSuite 文件夹 Group Restriction的探究

同一个角色&#xff0c;为什么相同的文件&#xff0c;有的用户可以看&#xff0c;而有的用户不能看呢&#xff1f;这其中与一个隐藏功能相关&#xff0c;即文件夹的Restriction相关&#xff0c;其中一个非常典型的点是Group Restriction&#xff08;组限制&#xff09;&#xf…

IO-Iink事件

IO-LINK事件功能 IO-Link的事件功能是其通信协议中的一项重要特性&#xff0c;主要用于传输设备的故障信息和维护信息。IO-Link支持三种数据类型&#xff1a;过程数据、参数数据和事件数据。其中&#xff0c;事件数据就是用于此目的。 当IO-Link设备&#xff08;如传感器或执…

【数据结构与算法 经典例题】使用栈实现队列(图文详解)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 目录 ​​一、问题描述 二、前置知识 三、解题思路 原理&#xff1a; 图解&…

Web 应用开源项目大全

Web 应用开源项目大全结合巴比达内网穿透实现WEB公开访问。 下面是一个Web应用的开源列表。没什么可说的&#xff0c;太疯狂了。尤其是Web 2.0那一堆。我不知道你怎么想&#xff0c;有些开源项目的源码写得挺不好的&#xff0c;尤其是性能方面。或许你会以为改一改他们就可以成…

qt 如何获取磁盘信息、QStorageInfo

以往获取qt磁盘信息&#xff0c;笔者是通过一下API转换的 BOOL GetDiskFreeSpaceExW([in, optional] LPCWSTR lpDirectoryName,[out, optional] PULARGE_INTEGER lpFreeBytesAvailableToCaller,[out, optional] PULARGE_INTEGER lpTotalNumberOfBytes,[out, optional…

26届软件工程生大二末的学期总结

一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 要不断的、反复的&#xff0c;爱上这个普通的自己。 本文简介&#xff1a;本人是大二软件工程专业&#xff0c;大二即将结束步入大三&#xff0c;这篇文章作为我的个人小笔记&#xff0c;只想在这里记录当下的心情与学习…

你如何看待市场波动性的?

实际上&#xff0c;波动性并不总是负面的&#xff0c;它有时也孕育着快速获利的机会。 对于长期投资者而言&#xff0c;市场波动&#xff08;尤其与熊市相伴时&#xff09;往往是一个优势。它允许投资者拓展并多样化投资组合&#xff0c;以较低的价格购入投资工具&#xff0c;…