leetcode热题HOT 32. 最长有效括号

一、问题描述:

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
示例 3:
输入:s = “”
输出:0

二、栈:

  1. 创建一个 Deque 类型的栈 stack 来存储左括号的索引位置,并初始化一个变量 result 用于记录最长有效括号子串的长度,以及一个临时变量 temp。
  2. 将初始索引 -1 放入栈中,用于标记有效括号子串的起始位置。
  3. 遍历输入字符串 s 中的每个字符:
    ①如果当前字符是左括号 ‘(’,将其索引位置压入栈中。
    ②如果当前字符是右括号 ‘)’,表示可能找到了一对匹配的括号。弹出栈顶元素,因为右括号与之匹配的左括号已经被消去:
    如果栈为空,说明没有与当前右括号匹配的左括号,将当前右括号的索引位置压入栈中,作为新的有效括号子串的起始位置。
    如果栈不为空,计算当前右括号与栈顶元素(上一个未匹配的左括号)之间的距离,更新 result 为较大值,以求得最长有效括号子串的长度。
    ③返回 result,即最长有效括号子串的长度。
class Solution {public int longestValidParentheses(String s) {Deque<Integer> stack = new LinkedList<Integer>(); // 使用栈来记录左括号的索引位置int result = 0, temp = 0; // 初始化最终结果和临时变量stack.push(-1); // 将一个初始索引 -1 放入栈中,用于标记有效括号子串的起始位置for(int i = 0; i < s.length(); i++) { // 遍历字符串中的每个字符if(s.charAt(i) == '(') { // 当前字符是左括号stack.push(i); // 将当前左括号的索引位置压入栈中} else { // 当前字符是右括号stack.pop(); // 弹出栈顶元素,因为右括号与之匹配的左括号已经被消去if(stack.isEmpty()) { // 如果栈为空stack.push(i); // 将当前右括号的索引位置压入栈中,作为新的有效括号子串的起始位置} else { // 如果栈不为空result = Math.max(result, i - stack.peek()); // 更新最长有效括号子串的长度} }//System.out.println(result);}return result; // 返回最长有效括号子串的长度}
}
  • 时间复杂度分析:这段代码只需要一次遍历输入字符串 s,并且在每次遍历过程中,执行的操作都是常数时间复杂度的操作(如栈的压入、弹出、判断栈是否为空等)。因此,整体的时间复杂度为 (O(n)),n是输入字符串的长度。

三、动态规划:

  1. 情况一:找到字符串形如 “……()”,找到()的前一个位置,所以 dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
  2. 情况二:找到字符串形如 “((……))”,找到子串“((……))” 前的第一个位置 i - dp[i - 1] - 2,所以 dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
class Solution {public int longestValidParentheses(String s) {int result = 0; // 用于记录最长有效括号子串的长度int[] dp = new int[s.length() + 1]; // dp[i] 表示以第 i 个字符结尾的最长有效括号子串的长度dp[0] = 0; // 初始化,第 0 个字符的最长有效括号子串长度为 0// 从第一个字符开始遍历到倒数第二个字符for (int i = 1; i < s.length(); i++) {if (s.charAt(i) == ')') { // 当前字符为 ')'//情况一:字符串形如 “……()”if (s.charAt(i - 1) == '(') { // 前一个字符是 '(',形成了有效括号对 "()"dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2; // 更新当前字符结尾的最长有效子串长度为前一个字符的最长子串长度加上 2} //情况二:字符串形如 “……))”else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') { // 前一个字符是 ')',并且其前面有有效括号子串// 判断当前字符前面一个有效括号子串的前一个字符是否是 '(',如果是则更新当前字符结尾的最长有效括号子串长度//i - dp[i - 1] - 2是子串“((……))”前的一个位置dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;}result = Math.max(result, dp[i]); // 更新最长有效括号子串的长度}          }return result; // 返回最长有效括号子串的长度}
}
  • 时间复杂度分析:O(n),其中 n为字符串的长度。我们只需遍历整个字符串一次,即可将 dp 数组求出来。

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

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

相关文章

【智能算法】囊状虫群算法(TSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;S Kaur等人受到囊状虫群自然行为启发&#xff0c;提出了囊状虫群算法&#xff08;Tunicate Swarm Algorithm, TSA&#xff09;。 2.算法原理 2.1算法思想 TSA模拟了囊状虫群在导…

VTK----VTK数据结构详解3(代码篇)

上篇文章&#xff08;VTK----VTK数据结构详解&#xff08;计算机篇&#xff09;-CSDN博客&#xff09;从计算机数据结构&#xff08;数组、链表等&#xff09;的角度对数据数组、数据对象、数据属性的实现原理进行了说明&#xff0c;下面从代码的层面详细说明它们的使用及相关实…

nginx 交叉编译,启动报错nginx: [emerg] getgrnam(“nogroup“) failed 的原因和解决办法

目录 一、错误提示 nginx: [emerg] getgrnam("nogroup") failed二、解决办法三、测试 一、错误提示 nginx: [emerg] getgrnam(“nogroup”) failed nginx 交叉编译&#xff0c;在开发板上启动报错 nginx: [emerg] getgrnam("nogroup") failed二、解决办法…

TiDB系列之:TiCDC使用Changefeed完成数据同步任务

TiDB系列之:TiCDC使用Changefeed完成数据同步任务 一、Changefeed二、Changefeed 状态流转三、操作Changefeed四、cdc cli管理同步任务1.创建同步任务2.查询同步任务列表3.查询特定同步任务4.停止同步任务5.恢复同步任务6.删除同步任务7.更新同步任务配置8.管理同步子任务处理…

“npm error code ELSPROBLEMS“问题解决

在使用vite创建vue项目后&#xff0c;进入项目目录执行&#xff1a; npm ls出现如下报错&#xff1a; npm error code ELSPROBLEMS npm error missing: vitejs/plugin-vue^5.0.4, required by cmds0.0.0 npm error missing: vite^5.2.0, required by cmds0.0.0 npm error mis…

笔记本硬盘坏了怎么把数据弄出来 笔记本硬盘数据恢复一般需要多少钱

现在办公基本都离不开笔记本电脑&#xff0c;就连学生写作业也大多是都在电脑上完成。硬盘作为电脑存储的重要组成部分&#xff0c;承载着存储文件和各类软件的重任。如果硬盘出现故障&#xff0c;基本上这台电脑就无法正常工作&#xff0c;同时我们可能面临丢失很多重要的数据…

npm镜像切换

npm镜像切换 1, 修改 下载仓库为淘宝镜像 npm config set registry http://registry.npm.taobao.org/ 2, 如果要发布自己的镜像需要修改回来 npm config set registry https://registry.npmjs.org/ 3, 安装cnpm npm install -g cnpm --registryhttps://registry.npm.taob…

Go的json序列化与反序列化(Marshal与Unmarshal)

参考博客&#xff1a;Go的json序列化&#xff1a;Marshal与Unmarshal-CSDN博客

电气设备绝缘的高电压试验(二)——高电压的测量

本篇为本科课程《高电压工程基础》的笔记。 本篇为这一单元的第二篇笔记。上一篇传送门。 稳态高电压的测量 稳态高电压主要指的是工频交流高压和直流高压。高压测量系统常常含有转换装置、转换装置到试验品之间的引线、接地连线、低压测量回路和测量仪表等。 实验室测量方…

【python】语言学习笔记--用来记录总结

请问以下变量哪些是tuple类型&#xff1a; a ()b (1)c [2]d (3,)e (4,5,6)answer在Python中&#xff0c;元组&#xff08;tuple&#xff09;是由逗号分隔的一组值组成的有序序列&#xff0c;通常用圆括号括起来。让我们逐个检查变量&#xff0c;看哪些是元组类型&#xff…

【UE5.1 C++】提升编译速度

步骤 1. 在“C:\Users\用户\AppData\Roaming\Unreal Engine\UnrealBuildTool”目录下找到“BuildConfiguration.xml”文件 打开“BuildConfiguration.xml”&#xff0c;添加如下部分内容 <?xml version"1.0" encoding"utf-8" ?> <Configuratio…

7-41 图的删边操作

请编写程序对给定的有向图删除若干条边。有向图中包含n个顶点,编号为0至n-1。 输入格式: 输入第一行为两个正整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过1000。接下来e行表示每条边的信息,每行为3个非负整数a、b、c,其中a和b表示该边的端点编号,c表示…

JavaSE字节缓冲流

欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&#xff1a; 在我的博客中&a…

探索 VisionOS:从 Model3D 开始

终于从 VisionOS 的窗口 SwiftUI 应用程序转向尝试使用 RealityKit。这篇文章记录了学习它的基础知识Model3D和如何使用它的旅程。 寻找模型 最初对创建 3D Pokdex 概念验证感到很兴奋,但在检查了 Sketchfab 和 TurboSquid 等网站后找不到符合需求的皮卡丘模型时,遇到了障碍…

面试的时间地点(南京坦道)工程化问题比较少,通用性问题表较多

1.前端的选型 2.前端的$nicktick&#xff08;&#xff09; 3.前端的媒体查询 4.前端的 VUE 高级用法 我的回答{ web端视图层的渲染原理 } 5.前端的数组&#xff0c;异步处理 我的回答{ 回了&#xff0c;最笨的方法。 es6的set&#xff08;&#xff09;&#xff1b; 参数是&…

中移在线ChinaMobile系统单机和分布式应用的登录校验解决方案

单机的Tomcat应用登录校验&#xff1a; 用户首次登录成功后&#xff0c;服务端会创建一个Session会话&#xff0c;客户端会生成一个sessionid&#xff0c;客户端会把sessionid保存到cookie里&#xff0c;每次请求都携带这个sessionid&#xff0c;服务端通过校验来判断是拦截还是…

Vuforia AR篇(四)— AR虚拟按钮

目录 前言一、创建虚拟按钮二、创建脚本三、效果 前言 在当今互联网和移动设备普及的背景下&#xff0c;**增强现实&#xff08;AR&#xff09;**技术正迅速成为连接现实世界与数字信息的重要桥梁。AR虚拟按钮作为这一技术的创新应用&#xff0c;不仅提供了一种全新的用户交互…

mac上安装Tomcat

1. 简介 Tomcat 是一个开源的 Java 服务器&#xff0c;它实现了 Java Servlet、JavaServer Pages&#xff08;JSP&#xff09;和Java WebSocket 技术。Tomcat 是 Apache 软件基金会的一个项目&#xff0c;是一个轻量级、高性能的 Web 容器。作为一个 Web 服务器&#xff0c;To…

go设计模式之抽象工厂模式

抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 工厂方法模式通过引入工厂等级结构&#xff0c;解决了简单工厂模式中工厂类职责太重的问题&#xff0c;但由于工厂方法模式中的每个工厂只生产一类产品&#xff0c;可能会导致…

Angular创建项目

Angular创建项目 文章目录 Angular创建项目1. 创建项目1.1 直接安装1.2 跳过npm i安装 2. 运行程序 1. 创建项目 ng new 项目名称 1.1 直接安装 ng new angulardemo --同时会安装依赖包&#xff0c;执行的命令就是npm i 1.2 跳过npm i安装 ng new angulardemo --skip-inst…