BM77-最长的括号子串

news2024/9/20 16:42:32

题目

给出一个长度为 n 的,仅包含字符 '(' 和 ')' 的字符串,计算最长的格式正确的括号子串的长度。

  • 例1: 对于字符串 "(()" 来说,最长的格式正确的子串是 "()" ,长度为 2 .
  • 例2:对于字符串 ")()())" , 来说, 最长的格式正确的子串是 "()()" ,长度为 4 .

字符串长度:0≤n≤5∗10^5

要求时间复杂度 O(n) ,空间复杂度 O(n).

示例1

输入:

"(()"

返回值:

2

示例2

输入:

"(())"

返回值:

4


思路:动态规划

  • step 1:用dp[i]表示以下标为i的字符为结束点的最长合法括号长度。
  • step 2:很明显知道左括号不能做结尾,因此左括号都是dp[i]=0。
  • step 3:遍历字符串,因为第一位不管是左括号还是右括号dp数组都是0,因此跳过,后续只查看右括号的情况,右括号有两种情况:

情况一:

如图所示,左括号隔壁是右括号,那么合法括号需要增加2,可能是这一对括号之前的基础上加,也可能这一对就是起点,因此转移公式为:dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2。

情况二:

如图所示,与该右括号匹配的左括号不在自己旁边,而是它前一个合法序列之前,因此通过下标减去它前一个的合法序列长度即可得到最前面匹配的左括号,因此转移公式为:dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2。

  • step 4:每次检查完维护最大值即可。


代码

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param s string字符串
     * @return int整型
     */
    public int longestValidParentheses (String s) {
        //1.创建dp表
        //dp[i]表示以下标为i的字符为结束点的最长合法括号长度
        int[] dp = new int[s.length()];
        //2.初始化为0,省略
        int maxLen = 0;

        //3.填表
        //第一位不管是左括号还是右括号都是0,因此不用管
        for (int i = 1; i < s.length(); i++) {
            //取到左括号记为0,右括号才合法
            if (s.charAt(i) == ')') {
                if (s.charAt(i - 1) == '(') { //如果该右括号前一位就是左括号,计数+
                    dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
                } else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') { //找到这一段连续合法括号序列前第一个左括号做匹配
                    dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
                }
                //维护最大值
                maxLen = Math.max(maxLen, dp[i]);
            }
        }

        //4.返回值
        return maxLen;
    }
}

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

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

相关文章

AI Chat 设计模式:5. 策略模式

本文是该系列的第五篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的旁白。 问题列表 Q.1 我想学习一下策略模式A.1Q.2 你先给我简单讲解一下吧A.2Q.3 你举得这个电商平台例子不错&#xf…

青岛大学_王卓老师【数据结构与算法】Week04_09_线性表的应用2_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

使用 tail -f 实时观测服务器日志输出

在开发阶段, 有 console 端的输出, 总是可以方便实时地看到应用的日志. 可一旦应用部署到服务器上之后呢, 日志被输出到文件中, 在某些情景下需要不停地查看日志文件的输出以定位某些问题, 此时是否还能像开发那样实时查看日志呢? 答案是可以的! 这个命令就是 tail -f . tail…

vue2 element-ui 2.9.1版不支持抽屉el-drawer

一个老项目中想使用抽屉 el-drawer&#xff0c;死活没有反应。 查了下element-ui的版本是2.9.1 再看其他一个正常使用抽屉的项目的element-ui版本。 但是 2.14.1 的element-ui版本又存在菜单管理无法折叠菜单项的问题。 看来还是得抽空解决在2.14.1菜单无法折叠的问题了。

一文了解潜力黑马Infiblue:借力Web3,释放元宇宙价值

2013 年&#xff0c;JDN Dionisio 曾发表了一篇名为《3D Virtual Worlds and the Metaverse: Current Status and Future Possibilities》的论文&#xff0c;深入探讨与归纳了虚拟世界的几个发展阶段&#xff0c;可以简单的归纳为&#xff1a; 第一阶段&#xff1a;基于计算机文…

零代码量化投资:用ChatGPT获取新浪财经上的股票实时行情

现在很多免费的股票数据库&#xff0c;比如akshare&#xff0c;其实是从新浪财经或者东方财富网站上爬取下来的。如果能直接从新浪财经或者东方财富网站上爬取数据&#xff0c;可以获取更全面更即时的信息。 可以在ChatGPT中输入提示词如下&#xff1a; 写一段Python代码&…

探索stable-diffusion技术乐园:活学活用界面参数

开篇 嗨!欢迎踏入我们充满有趣和创新的stable-diffusion技术乐园,让我们一起走进stable-diffusion界面参数的世界,看看怎样如行家袋里取物般自在地活用这些参数! 看了这么多大V、大卡和群粉们使用的英文,提起来有点沉,别急,我会尽量使用轻松的语气带你一起探索这些小秘…

MySQL视图、索引、导入导出、执行计划

目录 一、前言 1.导读 2.学习的好处 二、视图 1.什么是视图 2.视图与数据表的区别 3.使用视图的优点 4.视图的语法 1.创建视图&#xff08;CREATE VIEW&#xff09; 2.查询视图数据 3.更新视图数据 4.修改视图定义(ALTER VIEW) 5.删除视图&#xff08;DROP VIEW&a…

VSCode中打开NodeJS项目自动切换对应版本的配置

这几年搞了不少静态站点&#xff0c;有的是Hexo的&#xff0c;有的是VuePress的。由于不同的主题对于NodeJS的版本要求不同&#xff0c;所以本机上不少NodeJS的版本。 关于如何管理多个NodeJS版本&#xff0c;很早之前就写过用nvm来管理的相关文章&#xff0c;这里就不赘述了&a…

第四范式携「式说」亮相世界人工智能大会 大模型落地进入加速时刻

7月6日-8日&#xff0c;以“智联世界 生成未来”为主题的2023世界人工智能大会&#xff08;WAIC&#xff09;在上海召开&#xff0c;本届大会聚焦通用人工智能发展。第四范式携「式说」大模型亮相现场&#xff0c;更有第四范式「大模型之城」首秀&#xff0c;汇聚了大模型在金融…

Elasticsearch【全文检索、倒排索引、应用场景、对比Solr、数据结构】(一)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch介绍_全文检索 Elasticsearch介绍_倒排索引 Elasticsearch介绍_Elasticsearch的出现 Elasticsearch介绍_Elasticsearch应用场景 Elasticsearch介绍_Elasticsearch对比Solr Elasticsearch介绍_Elasticsearch数据结构 Elasticsearch介绍_全文检索 Elasti…

休闲时光:最近上映的电影与爬虫世界,带您彻底放松!

大家好&#xff0c;我是安果&#xff01; 周末是与亲朋好友相聚的好时机&#xff0c;可以选择一部大家都喜欢的电影&#xff0c;彻底放松&#xff0c;共同度过一个愉快而难忘的周末 本篇文章将介绍如何使用 Scrapy 爬取最新上映的电影 目标对象&#xff1a; aHR0cHM6Ly93d3cubW…

深入浅出讲解Python中的可变类型与不可变类型,以及赋值,浅拷贝与深拷贝的区别

文章目录 1、不可变数据类型2、可变数据类型3、赋值&#xff0c;浅拷贝与深拷贝3.1 赋值操作符 3.2 浅拷贝copy()3.3 深拷贝copy() 小结 在Python中&#xff0c;数据类型主要分为可变数据类型和不可变数据类型。主要的区别在于可变数据类型的值可以改变&#xff0c;而不可变数据…

【网络系统集成】路由器实验

1.实验名称:路由器RIP协议配置 2.实验目的 在PacketTracer中进行模拟实验,配置RIP协议,验证RIP协议更新时间及路由状态变化,加深对路由器RIP协议相关知识的理解与掌握。 3.实验内容 (1)拓扑结构图 (2)ip地址分配与端口分配

Mybatis基础总结1

Mybatis快速入门 一.Mybatis快速入门1.1 框架介绍1.2 ORM介绍1.3 原始jdbc操作&#xff08;查询数据&#xff09;1.4原始jdbc操作&#xff08;插入数据&#xff09;1.5 原始jdbc操作的分析1.6 什么是Mybatis1.7 Mybatis的快速入门1.7.1 环境搭建1.7.2编写测试代码 1.8 知识小结…

Linux进程调度

转自&#xff1a;深入理解Linux进程调度(0.4)_进程调度 城_城中之城的博客-CSDN博客 一、进程调度概览 进程调度是操作系统最重要的内容之一&#xff0c;也是学习操作系统的重点和难点。关于进程本身的实现和管理请参看《深入理解Linux进程管理》。关于进程调度&#xff0c;我…

阿里云ECS服务器架构X86计算_ARM_GPU/FPGA_裸金属_超级计算集群

阿里云服务器架构有什么区别&#xff1f;X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群有什么区别&#xff1f;阿里云服务器网分享云服务器ECS架构详细说明&#xff1a; 目录 阿里云服务器ECS架构说明 X86计算 ARM计算 GPU/FPGA/ASIC 弹性裸金属服务…

mysql单表查询,排序,分组查询,运算符,select,order by,group by

CREATE TABLE emp (empno int(4) NOT NULL, --员工编号ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工名字job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工工作mgr int(4) NULL DEFAULT NU…

json 解析chrome浏览器插件json-handle

插件地址 非常好用&#xff0c;平常工作中需要经常查看对象属性&#xff0c;展开的时候往往都是很长的数据&#xff0c;有了这个大大提升效率了

云计算值得学习吗

云计算值得学习吗 云计算作为一项重要的技术和商业模式&#xff0c;未来的发展前景非常广阔。随着企业和个人对云计算需求的增长&#xff0c;以及新兴技术的不断突破和创新&#xff0c;云计算将继续引领科技进步和社会发展&#xff0c;并为用户带来更多的便利和创新&#xff0…