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

力扣_字符串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[i1] 为左括号, 则 d p [ i ] = d p [ i − 2 ] + 2 dp[i] = dp[i-2] + 2 dp[i]=dp[i2]+2
    • s [ i − 1 ] s[i-1] s[i1] 为右括号,
      • s [ i − 1 − d p [ i − 1 ] ] s[i-1-dp[i-1]] s[i1dp[i1]] 为左括号,则 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[i1]+dp[i2dp[i1]]+2
      • s [ i − 1 − d p [ i − 1 ] ] s[i-1-dp[i-1]] s[i1dp[i1]] 为右括号,则 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&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 方法 动态规划 d p [ i ] dp[i] dp[i] 表示以 s [ i ] s[i] s[i] 结尾的最长有效括号的长度如果 s [ i ] s[i] s[i] 为左括号&#…...

小程序接入企业微信「联系我」功能

接入模式有两种 1&#xff0c;展示二维码 可以直接调用服务端API的 配置客户联系「联系我」方式 得到二维码地址给到前端直接展示 2&#xff0c;展示类似“联系客服”的按钮&#xff08;文字和样式可以使用企业微信提供的几种&#xff09; a&#xff09;在小程序后台 “设置…...

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…...

计算机网络-物理层设备(中继器 集线器)

文章目录 中继器中继器的功能再生数字信号和再生模拟信号同一个协议 集线器&#xff08;多口中继器&#xff09;不具备定向传输的原因集线器是共享式设备的原因集线器的所有接口都处于同一个碰撞域&#xff08;冲突域&#xff09;内的原因 小结 中继器 中继器的功能 中继器的…...

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官方仓库地址&#xff1a;https://github.com/FiloSottile/mkcert#installation mkcert 是一个简单的工具&#xff0c;用于制作本地信任的开发证书。它不需要配置。 简化我们在本地搭建 https 环境的复杂性&#xff0c;无需操作繁杂的 openssl 实现自签证书了&#xff…...

RHCE DNS域名解析服务器

目录 1. 正向解析 1.1 安装必要软件 1.2 配置静态ip 1.3 DNS配置 1.4 测试 2. 反向解析 2.1 关闭安全软件&#xff0c;安装必要软件 2.2 配置静态ip 2.3 DNS配置 2.4 测试 1. 正向解析 1.1 安装必要软件 1.2 配置静态ip 服务器配置 nmcli c modify ens32 ipv4.method man…...

创建表与删除表(六)

表的基本操作&#xff08;六&#xff09; 一、创建表 1.1 使用DDL语句创建表 CREATE TABLE 表名(列名 类型,列名 类型......); 示例&#xff1a; 创建一个 employees 表包含雇员 ID &#xff0c;雇员名字&#xff0c;雇员薪水。 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…...

在前端开发中,常见的数组循环方式有以下几种:

在前端开发中&#xff0c;常见的数组循环方式有以下几种&#xff1a; for 循环&#xff1a;使用最传统的 for 循环来遍历数组元素。 const array [1, 2, 3, 4, 5];for (let i 0; i < array.length; i) {console.log(array[i]); }forEach() 方法&#xff1a;使用数组的 …...

Redis -- 单线程模型

失败是成功之母 ——法国作家巴尔扎克 目录 单线程模型 Redis为什么这么快 单线程模型 redis只使用一个线程&#xff0c;处理所有的命令请求&#xff0c;不是说redis服务器进场内部真的就只有一个线程&#xff0c;其实也有多个线程&#xff0c;那就是处理网络和io的线程。 R…...

C语言第十五弹---操作符(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 操作符 1、操作符的分类 2、二进制和进制转换 2.1、2进制转10进制 2.1.1、10进制转2进制数字 2.2、2进制转8进制和16进制 2.2.2、2进制转16进制 3. 原码、反…...

使用宝塔面板访问MySQL数据库

文章目录 前言一、安装访问工具二、查看数据库总结 前言 前面我们已经部署了前后端项目&#xff0c;但是却不能得到数据库的信息&#xff0c;看有谁再使用你的项目。例如员工、用户等等。本次博客进行讲解如何在宝塔面板里面访问MySQL数据库。 一、安装访问工具 1、打开软件商…...

Win10 双网卡实现同时上内外网

因为需要同时上内网和外网&#xff0c;但公司做了网络隔离&#xff0c;不能同时上内外网&#xff0c;所以多加了块无线网卡&#xff0c;配置双网关实现同时上内外网&#xff0c;互不影响 打开 Windows PowerShell&#xff08;管理员&#xff09;&#xff0c;输入&#xff1a;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驱动代码初始化代码…...

ChatGPT可与自定义GPTs一起使用,智能AI代理时代来啦!

1月31日凌晨&#xff0c;OpenAI在社交平台公布了一个超强新功能&#xff0c;可以在ChatGPT中输入“GPTs名字”的方法&#xff0c;调用多个自定义GPTs一起协同工作。 例如&#xff0c;我想开发一款社交APP&#xff0c;1&#xff09;可以先用专业分析GPTs做一下市场调研&#xf…...

《Numpy 简易速速上手小册》第1章:Numpy 基础(2024 最新版)

文章目录 1.1 创建和操作 Numpy 数组1.1.1 基础知识1.1.2 完整案例&#xff1a;多维数据分析1.1.3 拓展案例 1&#xff1a;时间序列数据1.1.4 拓展案例 2&#xff1a;图像数据处理 1.2 数组的索引和切片1.2.1 基础知识1.2.2 完整案例&#xff1a;时间序列分析1.2.3 拓展案例 1&…...

【美团】SaaS技术部-后端研发工程师(海外业务)

部门介绍 美团餐饮系统为餐饮企业提供一站式IT解决方案&#xff0c;帮助餐饮商户实现从供应链管理、生产管理、前厅管理到外卖的数字化经营。美团餐饮系统不仅打通了餐厅和平台&#xff0c;更帮助餐厅连接客人&#xff0c;让商户更了解顾客需求&#xff0c;在帮助商户做商业决…...

linux安装mongodb数据库启动报错? 都是冰红茶滴水儿

先展示报错信息 网上一大推说是关闭不正确导致的,然后给出的解决方法是 ./mongod -f mongodb.conf --repair吊用没有,还是报错: about to fork child process, waiting until server is ready for connections. forked process: 302226 ERROR: child process failed, exited…...

win11安装wsl作为linux子系统并当作服务器

wsl安装 打开控制面板&#xff0c;找到启用或关闭windows功能 开启windows虚拟机监控平台和适用于Linux的Windows子系统&#xff0c;重启电脑。 打开microsoft store搜索ubuntu&#xff0c;找到合适的版本下载安装 输入wsl -l如下所示&#xff0c;即为安装成功。 安装过程比较…...

户用光伏电站的管理包括哪些内容?需要怎么做?

户用光伏电站在运行后需要进行一系列的管理工作&#xff0c;包括安全、运行、质量和数据等等&#xff0c;从而保证电站的安全、经济、高效运行。 1.安全管理 光伏电站的安全管理是非常重要的&#xff0c;包括电站的防雷、防火、防盗等措施&#xff0c;以及电站内部的安全管理…...

Kafka-服务端-PartitionLeaderSelector、ReplicaStateMachine

PartitionLeaderSelector 通过对前面的分析可知&#xff0c;PartitionMachine将Leader副本选举、确定ISR集合的工作委托给了PartitionLeaderSelector接口实现&#xff0c;PartitionMachine可以专注于管理分区状态。这是策略模式的一种典型的应用场景。 图展示了PartitionLead…...

总结11(数组)

数组 1.为什么需要数组 为了解决大量同类型数据的存储和使用问题 为了模拟现实世界 2. 数组的分类 一维数组 1&#xff09;.怎样定义一维数组 为n个变量连续分配存储空间。 所有的变量数据类型必须相同。 所有变量所占的字节大小必须相等。 例子&#xff1a; int a[5]; &#x…...

扩展学习|大数据分析整合到价值创造的大见解

文献来源:Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接:链接:https://pan.baidu.com/s/14IGaCOc-plxAiaVhwOgUvA 提取码…...

蓝桥杯---牌型种数

小明被劫持到X赌城&#xff0c;被迫与其他3人玩牌。一副扑克牌(去掉大小王牌,共52张)&#xff0c;均匀发给4个人&#xff0c;每个人13张。这时&#xff0c;小明脑子里突然冒出一个问题&#xff1a;如果不考虑花色&#xff0c;只考虑点数&#xff0c;也不考虑自己得到的牌的先后…...