当前位置: 首页 > news >正文

2025年- H99-Lc207--32.最长有效括号(栈、动态规划)--Java版

1.题目描述

在这里插入图片描述

2.思路

把(压入栈中,并且把(放入栈顶。在遍历过程中遇到的每个),我们从栈顶弹出(,如果栈顶没有(,或者遍历完整个字符串栈中仍有元素,那么该字符串是无效的。
任何一个有效的括号字符串,其长度必然是偶数。比如 () 长度是2,(()) 长度是4,()() 长度也是4。一个长度为奇数的括号字符串(如 (、()))永远不可能是有效的。
在这里插入图片描述
在这里插入图片描述
长度为1的子串:比如 ( 或者 )。它们不可能是有效的,因为无法配对。

长度为2的子串:比如 ()。这是我们能找到的最短的、可能有效的括号组合。

现在,我们再来看代码的逻辑:

外层循环用 i 来确定子串的起点。
内层循环用 j 来确定子串的终点(不包含j)。

子串的长度是 j - i。
(())
0123

例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.代码实现

方法1:超时

class Solution {public boolean isValid(String s){Stack<Character> st=new Stack<Character>();//判断括号是不是有效的括号组合for(int i=0;i<s.length();i++){ // 遇到左括号,入栈if(s.charAt(i)=='('){st.push('(');}else// 遇到右括号 ')'{//遇到 )情况,此时栈不空并且栈顶元素是 (,弹出)去匹配if(!st.empty()&&st.peek()=='('){st.pop();}// 如果栈为空,或者栈顶不是 '(', 说明无法匹配,是无效字符串else{return false;}}}// 如果为空,所有括号都匹配了,返回true;否则说明有未匹配的左括号,返回false。return st.empty();}public int longestValidParentheses(String s) {int maxlen=0;//i确定子串的起点for(int i=0;i<s.length();i++){//j确定子串的终点,因为子串不可能是1个括号,奇数子串没有意义for(int j=i+2;j<=s.length();j=j+2){if(isValid(s.substring(i,j))){maxlen=Math.max(maxlen,j-i);}}}return maxlen;}
}

方法二:代研究

class Solution {public int longestValidParentheses(String s) {int maxlen = 0;Stack<Integer> stack = new Stack<>();// 关键:放入-1作为参照物stack.push(-1); for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == '(') {// 遇到 '(', 把索引压入栈stack.push(i);} else { // 遇到 ')'// 弹出一个元素stack.pop();if (stack.empty()) {// 如果栈空了, 说明当前的 ')' 没有匹配的 '('// 把当前 ')' 的索引放入,作为新的参照物stack.push(i);} else {// 如果栈不空, 计算当前有效长度// 长度 = 当前索引 - 新的栈顶索引maxlen = Math.max(maxlen, i - stack.peek());}}}return maxlen;}
}
http://www.lryc.cn/news/625923.html

相关文章:

  • strlen 函数的使用与模拟实现
  • 云原生俱乐部-mysql知识点归纳(2)
  • Java网络编程:TCP与UDP通信实现及网络编程基础
  • 无人机场景 - 目标检测数据集 - 山林野火烟雾检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • FastAPI 请求详解:全面掌握各种请求类型处理
  • 《基于大数据的全球用水量数据可视化分析系统》用Python+Django开发,为什么导师却推荐用Java+Spring Boot?真相揭秘……
  • 实践项目-1
  • Matplotlib数据可视化实战:Matplotlib图表注释与美化入门
  • LeetCode100-560和为K的子数组
  • Rust学习笔记(七)|错误处理
  • 2025年渗透测试面试题总结-21(题目+回答)
  • 堆、方法区、虚拟机栈、本地方法栈、程序计数器
  • RabbitMQ:SpringAMQP 多消费者绑定同一队列
  • Java配置文件
  • 第1章 React组件开发基础
  • 第10章 React应用测试
  • 我的SSM框架自学2
  • IDEA测试代码报java file outset source root异常
  • STM32-FreeRTOS快速入门指南(中)
  • 【软件安装】VScode介绍安装步骤及中文界面设置方法
  • 从数据孤岛到实时互联:Canal 驱动的系统间数据同步实战指南
  • Java 11中的Collections类详解
  • 正式签约 | OpenLoong 项目正式捐赠至开放原子开源基金会,成为全国首个具身智能方向孵化项目!
  • Vulkan笔记(十三)-帧缓冲区与命令池命令缓冲区
  • 使用 SemanticKernel 连接本地大模型 Ollama
  • 11.Ansible自动化之-内容集管理
  • 快手Klear-Reasoner登顶8B模型榜首,GPPO算法双效强化稳定性与探索能力!
  • 图像增强——灰度变换增强(线性,对数,指数)、空间滤波增强、频域增强、主成分/彩色合成增强(原理解释和代码示例)
  • FPGA 在情绪识别领域的护理应用(一)
  • Spring Boot应用实现图片资源服务