力扣_字符串2—最长有效括号
题目
给你一个只包含 ‘(’ 和 ‘)’ 的字符串 s s s,找出最长有效(格式正确且连续)括号子串的长度。
方法
动态规划
- d p [ i ] dp[i] dp[i] 表示以 s [ i ] s[i] s[i] 结尾的最长有效括号的长度
 - 如果 s [ i ] s[i] s[i] 为左括号,则 d p [ i ] = 0 dp[i] = 0 dp[i]=0
 - 如果  s [ i ] s[i] s[i] 为右括号, 
- 若 s [ i − 1 ] s[i-1] s[i−1] 为左括号, 则 d p [ i ] = d p [ i − 2 ] + 2 dp[i] = dp[i-2] + 2 dp[i]=dp[i−2]+2
 - 若  s [ i − 1 ] s[i-1] s[i−1] 为右括号, 
- 若 s [ i − 1 − d p [ i − 1 ] ] s[i-1-dp[i-1]] s[i−1−dp[i−1]] 为左括号,则 d p [ i ] = d p [ i − 1 ] + d p [ i − 2 − d p [ i − 1 ] ] + 2 dp[i] = dp[i-1] + dp[i-2-dp[i-1]] + 2 dp[i]=dp[i−1]+dp[i−2−dp[i−1]]+2
 - 若 s [ i − 1 − d p [ i − 1 ] ] s[i-1-dp[i-1]] s[i−1−dp[i−1]] 为右括号,则 d p [ i ] = 0 dp[i] = 0 dp[i]=0
 
 
 
栈
-  
始终保持栈底元素为最后一个没有被匹配的右括号的下标,这样的做法主要是考虑了边界条件的处理,栈里其他元素维护左括号的下标:
- 对于遇到的每个‘(’ ,我们将它的下标放入栈中
 - 对于遇到的每个‘)’,我们先弹出栈顶元素表示匹配了当前右括号: 
- 如果栈为空,说明当前的右括号为没有被匹配的右括号,我们将其下标放入栈中来更新我们之前提到最后一个没有被匹配的右括号的下标
 - 如果栈不为空,当前右括号的下标减去栈顶元素即为以该右括号为结尾的最长有效括号的长度
我们从前往后遍历字符串并更新答案即可。 
 
 -  
需要注意的是,如果一开始栈为空,第一个字符为左括号的时候我们会将其放入栈中,这样就不满足提及的最后一个没有被匹配的右括号的下标,为了保持统一,我们在一开始的时候往栈中放入一个值为 − 1 -1 −1 的元素
 
两次遍历
- 从左往右遍历字符串: 
- 当遇到左括号时, l e f t left left 加一;当遇到右括号时, r i g h t right right 加一;
 - 当 l e f t = = r i g h t left == right left==right,更新一次最长有效括号的长度
 - 当 l e f t < r i g h t left < right left<right,将两个变量清零;
 
 - 从右往左遍历字符串: 
- 当遇到左括号时, l e f t left left 加一;当遇到右括号时, r i g h t right right 加一;
 - 当 l e f t = = r i g h t left == right left==right,更新一次最长有效括号的长度
 - 当 l e f t > r i g h t left > right left>right,将两个变量清零;
 
 
代码
class Solution {
public:int longestValidParentheses(string s) {// int n = s.size();// stack<int> stk;// vector<vector<int>> ind_list;// stk.push(-1);// int ret = 0;// for(int i = 0; i < n; i++){//     if(s[i] == '('){//         stk.push(i);//     }//     else{//         if(stk.top() != -1){//             if(ind_list.size()>0 && stk.top()-ind_list[ind_list.size()-1][1] < 0){//                 ind_list[ind_list.size()-1][0] = stk.top();//                 ind_list[ind_list.size()-1][1] = i;//             }//             else//                 ind_list.push_back({stk.top(), i});//             if(ind_list.size()>=2){//                 int r1 = ind_list[ind_list.size()-2][1];//                 int l2 = ind_list[ind_list.size()-1][0];//                 int r2 = ind_list[ind_list.size()-1][1];//                 if(l2-r1 == 1){//                     ind_list[ind_list.size()-2][1] = r2;//                     ind_list.pop_back();//                 }//             }//             stk.pop();//         }//     }// }// for(int i = 0; i < ind_list.size(); i++){//     ret = max(ret, ind_list[i][1]-ind_list[i][0]+1);// }// return ret;// 1 dp// int n = s.size();// vector<int> dp(n, 0);// int ret = 0;// for(int i = 1; i < n; i++){//     if(s[i] == ')' && s[i-1] == '('){//         if(i >= 2)//             dp[i] = dp[i-2] + 2;//         else//             dp[i] = 2;//     }//     else if(s[i] == ')' && s[i-1] == ')'){//         if(i-1-dp[i-1] >= 0 && s[i-1-dp[i-1]] == '('){//             if(i-2-dp[i-1] >= 0)//                 dp[i] = dp[i-1] + 2 + dp[i-2-dp[i-1]];//             else    //                 dp[i] = dp[i-1] + 2;//         }//     }//     ret = max(ret, dp[i]);// }// return ret;// 2 stackint n = s.size();stack<int> stk;stk.push(-1);int ret = 0;for(int i = 0; i < n; i++){if(s[i] == '('){stk.push(i);}else{stk.pop();if(stk.empty()){stk.push(i);}else{ret = max(ret, i-stk.top());}}}return ret;// 3// int n = s.size();// int left = 0, right = 0;// int ret = 0;// for(int i = 0; i < n; i++){//     if(s[i] == '('){//         left++;//     }//     else{//         right++;//     }//     if(left == right){//         ret = max(ret, 2*left);//     }//     else if(right > left){//         right = 0;//         left = 0;//     }// }// left = 0; right = 0;// for(int i = n-1; i >= 0; i--){//     if(s[i] == '('){//         left++;//     }//     else{//         right++;//     }//     if(left == right){//         ret = max(ret, 2*left);//     }//     else if(right < left){//         right = 0;//         left = 0;//     }// }// return ret;}
};
相关文章:
力扣_字符串2—最长有效括号
题目 给你一个只包含 ‘(’ 和 ‘)’ 的字符串 s s s,找出最长有效(格式正确且连续)括号子串的长度。 方法 动态规划 d p [ i ] dp[i] dp[i] 表示以 s [ i ] s[i] s[i] 结尾的最长有效括号的长度如果 s [ i ] s[i] s[i] 为左括号&#…...
小程序接入企业微信「联系我」功能
接入模式有两种 1,展示二维码 可以直接调用服务端API的 配置客户联系「联系我」方式 得到二维码地址给到前端直接展示 2,展示类似“联系客服”的按钮(文字和样式可以使用企业微信提供的几种) a)在小程序后台 “设置…...
jdk17新特性—— 密封类(Sealed Classes)
目录 一、密封类(Sealed Classes)的概述1.1、概述1.2、特性1.3、注意事项 二、密封类(Sealed Classes)代码示例2.1、密封类(Sealed Classes)代码结构示例2.2、密封类(Sealed Classes)代码示例 三、密封类(Sealed Classes)接口代码示例3.1、密封类(Sealed Classes)接口代码结构示…...
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的HA高可用解决方案
盘点本年度我们探索服务的HA高可用解决方案 前言介绍HA高可用高可用性评估可用性是平均故障间隔时间 HA技术架构的特性分析Master/Slave架构主从复制模式主从复制的特性分析 高可用案例RocketMQ的主从架构责任划分同步机制动态化RocketMQ高可用架构中有限状态机的转换 总结Mast…...
计算机网络-物理层设备(中继器 集线器)
文章目录 中继器中继器的功能再生数字信号和再生模拟信号同一个协议 集线器(多口中继器)不具备定向传输的原因集线器是共享式设备的原因集线器的所有接口都处于同一个碰撞域(冲突域)内的原因 小结 中继器 中继器的功能 中继器的…...
PaddleDetection学习4——使用Paddle-Lite和OpencCV在 Android 上实现实时的人脸检测(java)
使用Paddle-Lite在 Android 上实现人脸检测 1 环境准备2. 部署步骤2.1 下载PaddleLite-android-demo2.2 运行face_detection_demo项目3 导入OpenCV进行优化3.1 Android Studio配置OpenCV3.2 预处理代码3.3 后处理代码3.4 优化结果1 环境准备 参考前一篇在 Android 上使用Paddl…...
mkcert的安装和使用,5分学会在本地开启localhost的https访问方式
mkcert官方仓库地址:https://github.com/FiloSottile/mkcert#installation mkcert 是一个简单的工具,用于制作本地信任的开发证书。它不需要配置。 简化我们在本地搭建 https 环境的复杂性,无需操作繁杂的 openssl 实现自签证书了ÿ…...
RHCE DNS域名解析服务器
目录 1. 正向解析 1.1 安装必要软件 1.2 配置静态ip 1.3 DNS配置 1.4 测试 2. 反向解析 2.1 关闭安全软件,安装必要软件 2.2 配置静态ip 2.3 DNS配置 2.4 测试 1. 正向解析 1.1 安装必要软件 1.2 配置静态ip 服务器配置 nmcli c modify ens32 ipv4.method man…...
创建表与删除表(六)
表的基本操作(六) 一、创建表 1.1 使用DDL语句创建表 CREATE TABLE 表名(列名 类型,列名 类型......); 示例: 创建一个 employees 表包含雇员 ID ,雇员名字,雇员薪水。 create table employees(employee_id int,em…...
微信开发者工具 git 拉取 failed invalid authentication scheme
微信开发者工具 git 拉取 failed invalid authentication scheme 拉取代码时报错,无效身份认证 解决方案: 1.检查git地址是否正常 2.检查git用户名密码是否正确...
(4)Elastix图像配准:3D图像
文章目录 前言1、项目实战2、参数文件2.1、parameter_file_rigid_3D.txt2.2、parameter_file_affine_3D.txt2.3、parameter_file_bspline_3D.txt前言 (1)Elastix图像配准:原理 + 源码(详解) (2)Elastix图像配准:参数文件(配准精度的关键) 1、项目实战 将以下文件保…...
windows安装oracle之后怎么连接使用
目录 1.打开SQl Developer 2.选择JDK 3.登录 4.创建表空间,用户 安装oracle的详细教程 WINDOWS安装Oracle11.2.0.4-CSDN博客 1.打开SQl Developer 找到 SQl Developer 2.选择JDK 根据你安装的oracle版本,因为我的oracle是安装的32位的,所以这里jdk也要选择32位 选择到ja…...
在前端开发中,常见的数组循环方式有以下几种:
在前端开发中,常见的数组循环方式有以下几种: for 循环:使用最传统的 for 循环来遍历数组元素。 const array [1, 2, 3, 4, 5];for (let i 0; i < array.length; i) {console.log(array[i]); }forEach() 方法:使用数组的 …...
Redis -- 单线程模型
失败是成功之母 ——法国作家巴尔扎克 目录 单线程模型 Redis为什么这么快 单线程模型 redis只使用一个线程,处理所有的命令请求,不是说redis服务器进场内部真的就只有一个线程,其实也有多个线程,那就是处理网络和io的线程。 R…...
C语言第十五弹---操作符(上)
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 操作符 1、操作符的分类 2、二进制和进制转换 2.1、2进制转10进制 2.1.1、10进制转2进制数字 2.2、2进制转8进制和16进制 2.2.2、2进制转16进制 3. 原码、反…...
使用宝塔面板访问MySQL数据库
文章目录 前言一、安装访问工具二、查看数据库总结 前言 前面我们已经部署了前后端项目,但是却不能得到数据库的信息,看有谁再使用你的项目。例如员工、用户等等。本次博客进行讲解如何在宝塔面板里面访问MySQL数据库。 一、安装访问工具 1、打开软件商…...
Win10 双网卡实现同时上内外网
因为需要同时上内网和外网,但公司做了网络隔离,不能同时上内外网,所以多加了块无线网卡,配置双网关实现同时上内外网,互不影响 打开 Windows PowerShell(管理员),输入:ro…...
Django模型(六)
一、其它查询 文档:https://docs.djangoproject.com/zh-hans/4.1/ref/models/querysets/#count 1.1、排序 Queryset.order_by(*fields) 默认情况下,QuerySet 返回的结果是按照模型 Meta 中的 ordering 选项给出的排序元组排序的 可以通过使用 order_by 方法在每个 QueryS…...
【Linux】Linux基本指令
目录 1.ls指令 2.cd指令 3.touch指令 4.mkdir指令 5.rmdir指令和rm指令 5.1rmdir指令 5.2rm指令 6.man指令 7.cp指令 8.mv指令 9.cat指令 10.more指令 && less指令 10.1more指令 10.2less指令 11.head指令 && tail指令 11.1head指令 11.2tai…...
stm32中的SPI
SPI的简介 文章目录 SPI的简介物理层协议层基本通讯过程起始和终止信号数据有效性CPOL/CPHA及通讯模式 STM3的SPI特性及架构通讯引脚时钟控制逻辑数据控制逻辑整体控制逻辑通讯过程 代码配置实现指令集结构体的定义SPI时钟信号的定义SPI端口定义SPI命令 flash驱动代码初始化代码…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
