LeetCode 32:最长有效括号

一、题目描述

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

示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:

输入:s = ""
输出:0

提示:

  • 0 <= s.length <= 3 * 104
  • s[i] 为 '(' 或 ')'

二、思路分析

本题可以采用栈的方法解决,创建一个 leftStart 变量来表示指向合法括号的最左边的索引位置,用 result 记录最长有效(格式正确且连续)括号子串的长度。

三、代码参考

1、Java

class Solution {public int longestValidParentheses(String s) {// 创建栈空间Stack<Integer> stack = new Stack<>();// result 记录最长有效(格式正确且连续)括号子串的长度int result = 0;// 设置变量 leftStart 表示合法括号序列的起始索引位置,指向一个左括号,初始值为 0int leftStart = 0 ;// 循环遍历字符串数组for(int i = 0; i < s.length(); i++){// 访问左括号时,把它存储到栈里if(s.charAt(i) == '('){stack.push(i);}// 访问右括号时else{// 如果当前栈为空,说明这个右括号在前面没有和它匹配的左括号,那么 leftStart 需要发生改变if(stack.isEmpty()){// 索引变为当前字符的下一个leftStart = i + 1;}else{// 移除栈顶元素stack.pop();// 如果此时栈为空,说明当前右括号为右端点的合法括号序列的左端点为 leftStart,则更新长度 i - leftStart + 1if(stack.isEmpty()){result = Math.max(result, i - leftStart + 1);}// 如果栈不为空,找到了一组合法的括号序列,左括号是刚刚弹出的元素,长度可以通过 i - stack.peek() 获取else{result = Math.max(result, i - stack.peek());}}}}// 返回结果return result;}
}

2、Python

class Solution(object):def longestValidParentheses(self, s):# 创建栈空间stack = []# result 记录最长有效(格式正确且连续)括号子串的长度result = 0# 设置变量 leftStart 表示合法括号序列的起始索引位置,指向一个左括号,初始值为 0leftStart = 0# 循环遍历字符串数组for i in range(len(s)):# 访问左括号时,把它存储到栈里if s[i] == '(':stack.append(i)# 访问右括号时else :# 如果当前栈为空,说明这个右括号在前面没有和它匹配的左括号,那么 leftStart 需要发生改变if not stack:# 索引变为当前字符的下一个leftStart = i + 1else :# 移除栈顶元素stack.pop()# 如果此时栈为空,说明当前右括号为右端点的合法括号序列的左端点为 leftStart,则更新长度 i - leftStart + 1if not stack:result = max(result, i - leftStart + 1)# 如果栈不为空,找到了一组合法的括号序列,左括号是刚刚弹出的元素,长度可以通过 i - stack[-1] 获取else :result = max(result, i - stack[-1])# 返回结果return result

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

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

相关文章

leetcode递归算法题总结

递归本质是找重复的子问题 本章目录 1.汉诺塔2.合并两个有序链表3.反转链表4.两两交换链表中的节点5.Pow(x,n) 1.汉诺塔 汉诺塔 //面试写法 class Solution { public:void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {dfs(a,b…

踩坑记录-安装nuxt3报错:Error: Failed to download template from registry: fetch failed;

报错复现 安装nuxt3报错&#xff1a;Error: Failed to download template from registry: fetch failednpx nuxi init nuxt-demo 初始化nuxt 项目 报错 Error: Failed to download template from registry: fetch faile 解决方法 配置hosts Mac电脑&#xff1a;/etc/hostswin电…

众和策略:中一签最多赚超2万元!又有新股大涨

A股商场整体低位轰动 今天上午A股商场整体低位轰动。 板块和赛道方面&#xff0c;煤炭板块再度领涨&#xff0c;板块涨幅逾越1%&#xff0c;云煤动力涨停。 公用事业、钢铁、传媒、石油石化等板块涨幅居前。电子、计算机、通讯等板块跌幅居前。 概念板块方面&#xff0c;化…

深入探索小红书笔记详情API:解锁内容创新的无尽潜力

一、引言 在当今信息爆炸的时代&#xff0c;内容创新已经成为品牌和个人脱颖而出的关键。小红书&#xff0c;作为全球最大的消费类口碑库之一&#xff0c;每天产生大量的用户生成内容。而小红书笔记详情API&#xff0c;作为一个强大的工具&#xff0c;能够为内容创作者提供深入…

fpga xvc 调试实现,支持多端口同时调试多颗FPGA芯片

xilinx 推荐的实现结构方式如下&#xff1a; 通过一个ZYNQ运行xvc服务器&#xff0c;然后通过zynq去配置其他的FPGA&#xff0c;具体参考设计可以参考手册xapp1251&#xff0c;由于XVC运行的协议是标准的TCP协议&#xff0c;这种方式需要ZYNQ运行TCP协议&#xff0c;也就需要运…

uView Form 表单

此组件一般用于表单场景&#xff0c;可以配置Input输入框&#xff0c;Select弹出框&#xff0c;进行表单验证等。 注意&#xff1a; 由于在nvue下&#xff0c;u-form名称被uni-app官方占用&#xff0c;在nvue页面中请使用u--form名称&#xff0c;在vue页面中使用u--form或者u-…

【普中开发板】基于51单片机音乐盒LCD1602显示( proteus仿真+程序+设计报告+讲解视频)

【普中开发板】基于51单片机音乐盒LCD1602显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P08 1. 主要功能&#xff1a; 基于51单片机AT89C51/52&#…

LLVM(简介)

历史 LLVM(low level virtual machine)起源于伊利诺伊大学的一个编译器实验项目&#xff0c;目前已经发展成一个集编译器和工具链为一体的商业开源项目&#xff0c;因此其英文名称的含义被扩大&#xff0c;不再仅仅是字面意思。其创始人为 Chris Lattner。LLVM项目遵循的开源许…

计算机软件考试试题——附答案

计算机软件考试试题 选择题 在面向对象编程中&#xff0c;继承的主要作用是&#xff1a; A. 提高代码的可读性B. 隐藏对象的实现细节C. 实现多重继承D. 复用已有代码 数据库中&#xff0c;以下哪个操作用于删除表中的所有数据&#xff0c;但保留表的结构&#xff1f; A. DELET…

Go语言命令行参数及cobra使用教程

Go语言命令行参数及cobra使用教程 1.原生命令行参数2.使用CIL框架Cobra创建 rootCmd创建你的 main.go创建其他命令子命令返回和处理错误 3.cobra使用标志4.Cobra位置参数和自定义参数5.Cobra PreRun和PostRun钩子 1.原生命令行参数 os 包以跨平台的方式&#xff0c;提供了一些…

Spring Boot 整合 MinIO自建对象存储服务

GitHub 地址&#xff1a;GitHub - minio/minio: The Object Store for AI Data Infrastructure 另外&#xff0c;MinIO 可以用来作为云原生应用的主要存储服务&#xff0c;因为云原生应用往往需要更高的吞吐量和更低的延迟&#xff0c;而这些都是 MinIO 的优势。安装过程跳过。…

CSS Grid 和 Flexbox

1.使用示例 CSS Grid&#xff1a; CSS Grid 是一种二维网格布局系统&#xff0c;可以用于创建复杂的网格布局。它允许你将元素放置到网格的行和列上&#xff0c;并通过设置网格属性来控制元素的位置和大小。 创建一个简单的 CSS Grid 布局&#xff0c;可以按照以下步骤进行&a…

Numpy基础

目录&#xff1a; 一、简介:二、array数组ndarray&#xff1a;1.array( )创建数组&#xff1a;2.数组赋值和引用的区别&#xff1a;3.arange( )创建区间数组&#xff1a;4.linspace( )创建等差数列&#xff1a;5.logspace( )创建等比数列&#xff1a;6.zeros( )创建全0数组&…

半导体设备系列:半导体制造产能扩张,设备零部件需求旺盛

近年来国内半导体制造产能不断扩张&#xff0c;半导体设备厂商加速成长。我们认为下游发展将拉动上游本地化配套需求&#xff0c;半导体设备零部件迎来高增长阶段。 摘要 半导体设备零部件包含密封圈、EFEM、射频电源、静电吸盘、硅电极、真空泵、气体流量计、喷淋头等产品&a…

python数据分析之交叉验证

python数据分析之交叉验证 1、常用的分类算法 有监督:SVM向量机、梯度提升、决策树(随机森林)、朴素贝叶斯、逻辑斯蒂回归、神经网络(cnn、rnn) 无监督:k-means、隐马尔可夫 2、数据分析过程 1、采集数据 2、数据预处理 3、特征选择 4、模型训练、评估、保存 5、模型…

JVM虚拟机:各种JVM报错总结

错误 java.lang.StackOverflowError java.lang.OutOfMemoryError:java heap space java.lang.OutOfMemoryError:GC overhead limit exceeded java.lang.OutOfMemoryError:Direct buffer memory java.lang.OutOfMemoryError:unable to create new native thread java.lang.OutOf…

时间计算总结

文章目录 1.1&#xff1a;Java 获取两个时间的时间差(时、分、秒)&#xff1a;依赖&#xff1a;方法的说明方法测试 2.1 获取当天的开始时间2.2 获取当天的结束时间2.3 获取昨天的开始时间2.4 获取昨天的结束时间2.5 获取明天的开始时间2.6 获取明天的结束时间2.7 获取本周的开…

第3章 【课后习题】(完整版)

【3.18】写出下面程序的运行结果 //3.18写出下面程序的运行结果 #include <iostream> using namespace std; class test{public:test();~test() {};private:int i; }; test::test() {i25;for(int ctr0;ctr<10;ctr){cout<<"Counting at "<<ctr…

深入浅出:理解 JavaScript 中的 Promise.all()

在现代的 JavaScript 开发中&#xff0c;异步编程是一个无法避免的话题。无论是处理网络请求&#xff0c;用户输入&#xff0c;还是文件操作&#xff0c;异步编程都扮演着核心角色。ES6 引入的 Promise 极大地简化了异步操作&#xff0c;而 Promise.all() 则为处理多个并行的异…

线程的深入学习(二)

前言 上一篇讲了线程池的相关知识&#xff0c;这篇文章主要讲解一个 1.并发工具类如CountDownLatch、CyclicBarrier等。 2.线程安全和并发集合&#xff1a; 3.学习如何使用Java提供的线程安全的集合类&#xff0c;如ConcurrentHashMap、CopyOnWriteArrayList等。 并发工具类 …