leetcode32-最长括号匹配-栈实现

求解最长括号匹配问题 这是典型的动态规划求解最长括号匹配问题。 立即下载

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

 

示例 1:

 

输入: "(()"

输出: 2

解释: 最长有效括号子串为 "()"

示例 2:

 

输入: ")()())"

输出: 4

解释: 最长有效括号子串为 "()()"

 

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/longest-valid-parentheses

 

解决方案1,通过栈来解决

常用的括号匹配都是使用栈来解决,通过栈可以很容易的找到栈的匹配。

这个问题,可以分解:

  1. 连续的括号的求解。
  2. 分段的括号数求解问题
  3. 求最大的连接括号数。

 

 

连续括号求解 

连接括号的求解问题,这个比较容易,可以直接使用栈来实现

/**
 *
连续括号的求解问题
 
*
 * @param
s
 
* @return
 
*/

public int parenthess(String s) {
 
if (null == s || s.length() < 1) {
   
return 0;
 
}

 
char[] data = s.toCharArray();
  int
length = 0;

 
Stack<Character> stack = new Stack<>();

  for
(int i = 0; i < data.length; i++) {
   
// 左括号进行压栈操作
   
if (data[i] == LEFT_PARENTHESS) {
      stack.push(data[i])
;
   
} else {
     
// 在匹配上右括号时,弹出一个左括号,长度++
      //
只需要统计左括号,即可*2就可得到总匹配括号数
     
if (!stack.isEmpty()) {
        stack.pop()
;
       
length++;
     
}
    }
  }

 
return length * 2;
}

 

这个代码比较简单,通过统计左括号的数量*2,即可得到总的匹配括号数。

 

分段的括号数求解问题

刚刚的代码只能统计连接的括号,如果出现不连接的就会出现问题。

怎么解决这个问题呢?我的思路这样子的

只需要加入一个变量来记录下不匹配的位置即可,

那不连续的位置在哪里?

我觉得满足这两个条件:

  1. 栈为空
  2. 当前为右括号。

满足这两个条件,将位置记录下来。

 

/**

 * 分段连续括号的求解问题

 *

 * @param s

 * @return

 */

  public int parenthessSegment(String s) {

  if (null == s || s.length() < 1) {

    return 0;

  }

  

  char[] data = s.toCharArray();

  int length = 0;

  int badIndex = -1;

  

  Stack<Character> stack = new Stack<>();

  

  for (int i = 0; i < data.length; i++) {

    // 左括号进行压栈操作

    if (data[i] == LEFT_PARENTHESS) {

      stack.push(data[i]);

    } else {

      // 在匹配上右括号时,弹出一个左括号,长度++

      // 只需要统计左括号,即可*2就可得到总匹配括号数

      if (!stack.isEmpty()) {

        stack.pop();

        length++;

      } else {

        badIndex = i;

      }

    }

  }

  

  return length * 2 - badIndex;

  }

 

当不连接括号出现为右括号时,可以进行正确的验证。

例如:“())(((()))”

 

但是,如果出现不连续的括号为左括号呢?那是否还能正确匹配呢?

例如: “()((((()))”

答案是不能的,我们的匹配规则是按照左括号压栈操作,右括号进行配对操作。但现在不匹对的是左括号,全部压入了栈。而判断条件是栈为空,并且当前为右括号,条件不满足。需要对此问题进行修正。

 

我们对栈中的存储进行下修改,之前是存储括号,现在改为存储左括号的索引下标

通过不匹配的位置badindex=-1开始

当栈遍历到索引下标为1时,括号发生配对,索引为0的左括号被弹出栈

现在计算括号数,有此规则当前索引号减去不匹配的位置=括号数

即1-(-1)=2

当遍历到索引为7时,栈中的元素,发生匹配,索引6被弹出,计算7的连接括号数,

有此规则,当前索引号减去栈顶的索引号=连接括号数。

索引7的连接括号数: = 7- 5 = 2

是否后续也有如此规则,再看下索引8

索引8的连接括号数:8-4=4

 

那用代码实现出来,就是这样子:

 

/**

 * 分段连续括号的求解问题

 *

 * @param s

 * @return

 */

  public int parenthessSegment(String s) {

  if (null == s || s.length() < 1) {

    return 0;

  }

  

  char[] data = s.toCharArray();

  int length = 0;

  int badIndex = -1;

  

  Stack<Integer> stack = new Stack<>();

  

  for (int i = 0; i < data.length; i++) {

    // 左括号进行压栈操作

    if (data[i] == LEFT_PARENTHESS) {

      stack.push(i);

    } else {

      // 在匹配上右括号时

      if (!stack.isEmpty()) {

        stack.pop();

        // 如果还存在元素,则使用当前索引减栈顶索引

        if (!stack.isEmpty()) {

          length = i - stack.peek();

        }

        // 当前已经为空了,说明需要命名用上次出现不匹配的位置.

        else {

          length = i - badIndex;

        }

      } else {

        badIndex = i;

      }

    }

  }

  

  return length;

  }

 

到现在为止,已经能求解连接的括号数了。

 

求最大的连接括号数

这个题目的要求是求解最长的匹配括号数。

这个就比较容易了,只需要判断下,留下最大的括号数即可

/**

 * 分段连续括号的求解问题,最终解决

 *

 * @param s

 * @return

 */

  public int parenthessLast(String s) {

  if (null == s || s.length() < 1) {

    return 0;

  }

  

  char[] data = s.toCharArray();

  int length = 0;

  int badIndex = -1;

  int maxLengthParenthess = 0;

  

  Stack<Integer> stack = new Stack<>();

  

  for (int i = 0; i < data.length; i++) {

    // 左括号进行压栈操作

    if (data[i] == LEFT_PARENTHESS) {

      stack.push(i);

    } else {

      // 在匹配上右括号时

      if (!stack.isEmpty()) {

        stack.pop();

        // 如果还存在元素,则使用当前索引减栈顶索引

        if (!stack.isEmpty()) {

          length = i - stack.peek();

        }

        // 当前已经为空了,说明需要命名用上次出现不匹配的位置.

        else {

          length = i - badIndex;

        }

        if (length > maxLengthParenthess) {

          maxLengthParenthess = length;

        }

      } else {

        badIndex = i;

      }

    }

  }

  

  return maxLengthParenthess;

  }

 

 

 

[代码开源]基于DistFlow的IEEE33和IEEE69节点最优潮流模型(OPF)实现与性能分析 本文详细介绍了基于DistFlow的IEEE33和IEEE69节点最优潮流模型(OPF)的实现与性能分析。通过代码开源,展示了如何从零搭建电力系统优化模型,解决配电网中的发电成本最小化问题。文章涵盖数据准备、模型实现细节、性能优化建议及常见问题解答,为电力系统研究者提供实用参考。 阅读详情

相关推荐

Colab虚拟环境配置全攻略:从安装到实战应用

本文详细介绍了在Google Colab中配置Python虚拟环境的完整流程与实战技巧。通过安装Anaconda、创建独立环境、解决常见错误及结合深度学习项目应用,帮助用户有效管理依赖、避免冲突,并利用环境持久化策略提升在Colab中的开发效率与项目可复现性。

weixin_29204121的博客 339

图解LeetCode:最长匹配括号

给定一个字符串,其中只包含左括号'(' 以及右括号 ')',要求返回最长的匹配括号长度。比如给定"(()",那么我们的函数需要返回2,因为...

码农的荒岛求生 965

全面分析总结解决Could not transfer artifact org.apache.maven.plugins等此类问题的方法

全面分析总结解决Could not transfer artifact org.apache.maven.plugins,Could not transfer artifact xxx from/to xxx等此类问题的方法

ccjjjjdff的博客 1万+

笔试面试算法经典--最长括号匹配

在求最长括号匹配之前先看看括号下面这个问题:括号匹配“ {()}”这种是括号匹配,而 “{ ] ] { ” 这种就不是括号匹配。判断一个给定的括号字符串是否是匹配的。对于括号匹配这类的问题可以使用 Stack来处理:1 . 当碰到”( [ { “这些左括号就进栈。2 . 如果碰到“) ] }”这些右括号时,如果栈为空,则肯定不匹配,返回false。如果栈不为空,则出栈比较两个括号是否匹配不匹配

有图有真相 6440

使用bandersnatch搭建pypi 本地镜像源(20211026)

需求背景:公司内网不能联网,同时开发工作需要各种python的模块,因此需要搭建一个pypi的本地镜像源。 参考网上的方法,总结了大致有下面几种方式搭建pypi本地源: devpi: 企业内网利用devpi搭建pypi私服 - 简书 pip2pi: https://yangfannie.com/1439.html pypiserver: https://zhongneng.github.io/2019/02/16/creat-pip/ bandersnatch:基于bandersnatch搭...

liurizhou的博客 6468

三极管简单振荡电路实现:从零开始的实战示例

通过一个基础实例,手把手教你如何利用三极管构建简单的振荡电路,深入理解三极管在实际电路中的工作原理与应用技巧。

weixin_32836713的博客 1202

LeetCode--最长有效括号匹配(动态规划,栈)

最长有效括号 给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: “(()” 输出: 2 解释: 最长有效括号子串为 “()” 示例 2: 输入: “)()())” 输出: 4 解释: 最长有效括号子串为 “()()” 动态规划 动态规划思想:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用...

weixin_41563161的博客 2049

AI 模型优化与部署秘籍:从理论到实战

本文系统介绍了AI模型优化与部署的关键技术。模型剪枝通过去除冗余参数减小模型规模,量化技术降低计算精度以提升效率,蒸馏方法实现知识从大模型到小模型的迁移。TensorRT通过层融合和精度校准加速GPU推理,ONNX格式实现跨框架模型转换,TFLite则优化移动端部署。这些技术共同解决了AI模型在资源受限环境下的部署难题,显著提升了模型运行效率,为AI应用落地提供了重要支撑。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 244

洛谷 P1944 最长括号匹配_NOI导刊2009提高(1)

洛谷 P1944 最长括号匹配_NOI导刊2009提高(1)题目题目描述对一个由(,),[,]括号组成的字符串,求出其中最长的括号匹配子串。具体来说,满足如下条件的字符串成为括号匹配的字符串:1.(),[]是括号匹配的字符串。2.若A是括号匹配的串,则(A),[A]是括号匹配的字符串。3.若A,B是括号匹配的字符串,则AB也是括号匹配的字符串。例如:(),[],([]),()()都是括号匹配的字符串

faojie的博客 816

2026华为OD面试题084:贪心的商人

商人经营一家店铺,有 `number` 种商品。由于仓库限制,每件商品的最大持有数量是 `item[index]`。 每种商品每天有一个价格 `item_price[item_index][day]`。通过对商品买进和卖出获取利润,请给出商人在 `days` 天内能获取到的最大利润。 注:同一件商品可以反复买进和卖出。 输入描述: - 第一行输入商品数量 `number` - 第二行输入商人售货天数 `days` - 第三行输入 `number` 个整数,表示每件商品的最大持有数量 `item[in

琅嬛福地 273

C#上位机国产化适配全方案:兼容统信UOS+鲲鹏/昇腾+国产PLC,可直接交付国企项目

去年下半年,我帮天津滨海新区一家给一汽丰田做配套的汽车零部件国企,完成了3条产线、12套C#上位机的全栈国产化适配。这个项目的背景很典型,也很戳中国企客户的命门:一开始客户找了两家本地的集成商,都没搞定:第一家只会用.NET Framework,根本不知道怎么在统信UOS上跑C#;第二家勉强用.NET Core 3.1跑起来了,但和汇川国产PLC的通信丢包率高达1.2%,产线根本不敢用。我们接手后,用了2个月完成全栈适配:从Windows Server 2019迁移到统信UOS 1070d服务器版,从.NE

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 497

最长括号匹配

题目          给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串,返回该子串的长度。          如:                   (():2                   ()():4                   ()(()):6                   (()()):6 分析

xueyingxue001的专栏 1494

新能源汽车动力总成研发测试技术全景深度报告(2025版)

本文所有企业案例数据均来自上市公司财报、工信部备案信息及权威媒体报道,技术参数经第三方检测报告交叉验证。研发测试人员能力矩阵重构(T型人才进阶路径)[10] 全球动力总成市场2035年预测报告。[9] NI电动汽车HIL测试架构技术文档。[3] 东风汽车智能化研发体系深度报告。[5] 混合动力测功机发明专利技术细节。[1] 领克动力总成试验中心技术解析。[7] 新能源汽车产业迭代趋势白皮书。测试架构师-数字工程。测试架构师-安全合规。测试架构师-人工智能。

优快云-新能源汽车研发测试专业博主 776

c语言用栈实现括号匹配_[LeetCode] 32. 最长有效括号

题目链接 : https://leetcode-cn.com/problems/longest-valid-parentheses/题目描述:给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。示例:示例 1:输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()"示例 2:输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"思路...

weixin_36304957的博客 263

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c语言用栈实现括号匹配_leetcode 32 最长有效括号(c++)

第一种:暴力法(超时)第二种:动态规划(8ms)第三种:栈(4ms)第四种:双指针(8ms)###题目给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的连续子串的长度。给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()"###思路暴力法超时了,官方提供的解法,场面真尴尬,考虑...

weixin_33140481的博客 462

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LeetCode 32:最长有效括号 —— 栈 + 标记法 题解

本文介绍了LeetCode 32题"最长有效括号"的栈+标记法解法。通过使用栈来匹配括号对并记录合法位置,再通过标记数组统计最长连续合法段长度。该方法时间复杂度O(n),空间复杂度O(n),具有思路直观、代码简洁、不易出错的优点。关键步骤包括:栈匹配标记合法位置、遍历查找最长连续1段。相比动态规划更简单易懂,是面试中的优选解法。

weixin_66162442的博客 289

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

​leetcode算法题第32题:最长有效括号​

给你一个只包含 和 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 具体做法是我们始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」,这样的做法主要是考虑了边界条件的处理,栈里其他元素维护左括号的下标:1.对于遇到的每个‘(’ ,我们将它的下标放入栈中 2.对于遇到的每个‘)’ ,我们先弹出栈顶元素表示匹配了当前右括号: 如果栈为空,说明当前的右括号为没有被匹配的右括号,我们将其下标放入栈中来更新我们之前提到的「最后一个没有被匹配的右括号的下标」

foolS22的博客 2220

力扣-32.最长有效括号

小结:括号匹配用栈的思路比较容易想到,但栈中的元素是位置坐标而不是括号,利用下标差来计算长度。小结:注意边界条件,以及两类不同情况。

weixin_46878941的博客 231

leetcode 32 dp+栈+两次遍历 多种解法

这个题真的是一道好题,看起来如此简单,实际却如此复杂(应该说包含了很多知识)。 解法一:dp 此题的dp定义是比较大胆的(其实也挺常规的),就是以当前字符结尾的最长有效长度。说他大胆是因为这样定义的话,所有以左括号结尾的dp值都为0. 状态转移:如果当前字符是右括号,并且上一个是左括号,那么比较简单,dp[i]=dp[i−2]dp[i] = dp[i-2]dp[i]=dp[i−2] 接下来就是核心:现在只剩一种情况,就是当前字符是右括号,上一个也是右括号。此时咱们看dp[i−1]dp[i-1]dp[i−1.

qq_39678022的博客 321

[LeetCode] 32. 最长有效括号(java实现)括号合法的两个结论

[LeetCode] 32. 最长有效括号(java实现)1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路(括号合法的两个结论): 因此我们可以根据性质①,将一段括号字符串划分为若干段,然后在每一段中找合法的括号,最后计算出最长的括号数; 如图所示 3. 解法 ---------------------------------------------------解法-------

cloud的博客 977

leetcode - [32. 最长有效括号]

leetcode - [32. 最长有效括号] 题目大意 给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 解题思路 提到括号匹配,第一时间能让人想到的就是利用栈。这里需要计算嵌套括号的总长度,所以栈里面不能单纯的存左括号,而应该存左括号在原字符串的下标,这样通过下标相减可以获取长度。那么栈如果是非空,栈底永远存的是当前遍历过的字符串中上一个没有被匹配的右括号的下标。上一个没有被匹配的右括号的下标可以理解为每段括号匹配之间的“隔板”。例如,())((())),

虾球 376

LeetCode32最长有效括号(DP+栈)

题目链接:Leetcode32 思路: 动态规划,复杂度O(n)O(n)O(n) 注意状态要设计成以i位置为结尾的最长合法长度而不能只单单设计前i个字符的最长合法串,否则转移方程很难得到,状态转移时注意前不要越界,特别是第三个case class Solution { public: int longestValidParentheses(string s) { //...

小胡同的诗 200

【Leetcode hot 100】32.最长有效括号

摘要:本文探讨了LeetCode第32题"最长有效括号"的两种解法。动态规划法通过定义dp[i]表示以字符i结尾的最长有效括号长度,区分两种匹配情况(前字符'('或')')进行状态转移。栈解法则利用栈记录无效位置,通过哨兵简化计算,匹配时更新最长长度。两种方法均为O(n)时间复杂度,动态规划更直观体现长度连续性,栈法通过哨兵简化边界处理。根据场景偏好选择适合的解法即可。

专注Java和MySQL领域知识分享 1131

leetcode:32. 最长有效括号

题目解析 :O(N * logN)级别的算法 :不需要检查参数有效性 要求返回最长有效的子串的长度像这样的题目都是有套路的。只需要这样思考:即:问题是,怎么求每个位置的答案综上:

OceanStar的博客 277

栈-[32] 最长有效括号

/* * @lc app=leetcode.cn id=32 lang=java * * [32] 最长有效括号 */ // @lc code=start class Solution { public int longestValidParentheses(String s) { int size = s.length(); // 直接返回 if(size == 0) return 0; // 模拟栈的操作 /.

qq_36790074的博客 105

LeetCode 32. 最长有效括号

LeetCode 32. 最长有效括号 解题思路:1. 动态规划;2. 栈。算法思路主要参考了LeetCode官方答案。 只要是括号匹配这种问题,一般都可用栈解决。下面栈的方法代码中,栈底一直维持着一个当前有效括号串的上一个字符的坐标,也就是官方答案中说的边界,这样才能记录最长的有效括号串长度。 其它的算法思路细节,可以查看官方答案。 代码实现: //方法一:动态规划 class Solution { public: int longestValidParentheses(string s) {

享受当下 137
上一篇: 自己动手实现搜索引擎之数据采集
下一篇: 栈
null_null_bug
博客等级 码龄7年 72粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值