首页 > 其他分享 >每日一题:Leetcode-32 最长有效括号

每日一题:Leetcode-32 最长有效括号

时间:2024-07-24 17:24:53浏览次数:10  
标签:子串 有效 32 maxans 括号 长度 Leetcode dp

力扣题目

解题思路

java代码

力扣题目:

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号

子串

的长度。

示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:

输入:s = ""
输出:0

提示:

  • 0 <= s.length <= 3 * 104
  • s[i] 为 '(' 或 ')'

解题思路:

  • 首先在 longestValidParentheses 方法中,定义了变量 maxans 来存储最长有效括号子串的长度,创建了一个整数数组 dp ,其长度与输入字符串 s 相同。

  • 然后通过一个循环从第二个字符开始遍历字符串。

  • 当遇到 ) 时,分两种情况进行处理:

    • 如果前一个字符是 ( ,则 dp[i] 的值为 (i >= 2? dp[i - 2] : 0) + 2 。这意味着如果当前位置 i 之前至少有两个字符,那么当前有效括号子串的长度为前两个位置的 dp 值(如果有)加上 2;否则,直接为 2。
    • 如果前一个字符也是 ) ,并且在当前位置减去前一个有效括号子串长度再往前一个位置的字符是 ( ,则 dp[i] 的值为 dp[i - 1] + ((i - dp[i - 1]) >= 2? dp[i - dp[i - 1] - 2] : 0) + 2 。这表示当前有效括号子串的长度为前一个有效括号子串的长度,加上当前位置与前一个有效括号子串之间可能存在的有效括号子串长度(如果有),再加上 2 。
  • 在每次循环中,都更新 maxans 为当前 dp[i] 和之前的 maxans 中的最大值。

例如,对于输入字符串 ")()())" :

  • 从第二个字符开始,遇到 ) 且前一个是 ( ,dp[1] = 2 。
  • 继续,遇到第三个 ) ,由于不满足前面的条件,dp[2] = 0 。
  • 遇到第四个 ) ,满足第二种情况,dp[3] = dp[1] + 2 = 4 。

最终返回的 maxans 就是最长有效括号子串的长度。

java代码:

package org.example.mouth7.today23;

public class Leetcode32 {
    public static void main(String[] args) {
        String s = ")()())";
        System.out.println(longestValidParentheses(s));
    }
    public static int longestValidParentheses(String s) {
        int maxans = 0;
        int[] dp = new int[s.length()];
        for (int i = 1; i < s.length(); i++) {
            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;
                }
                maxans = Math.max(maxans, dp[i]);
            }
        }
        return maxans;
    }
}

更多详细内容同步到公众号,感谢大家的支持!

每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项

标签:子串,有效,32,maxans,括号,长度,Leetcode,dp
From: https://blog.csdn.net/LIUCHANGSHUO/article/details/140660343

相关文章

  • fp32的表示精度范围计算
    是的,在IEEE754标准中,浮点数表示的指数的底(基数)是2。这意味着浮点数表示遵循二进制科学记数法,即数值表示为尾数(Significand或Mantissa)乘以2的指数次方。浮点数表示浮点数的表示形式通常为: 其中:sign:符号位,0表示正数,1表示负数。fraction:尾数位,也称为小数部分,表示......
  • SPI协议——结合百问网STM32入门 STM32 HAL快速入门与项目实战视频
    目录1、SPI协议的概念2、SPI的传输模式2.1SPI工作模式2.2SPI传输模式2.3SPI操作方法3、时序图4、代码实现4.1SPIHAL库编程4.2中断方式4.3DMA方式函数说明5、总结5.1SPI协议的优点5.2SPI协议的缺点1、SPI协议的概念SPI(SerialPeripheralInterface,......
  • LeetCode226. 翻转二叉树
    LeetCode题目链接:https://leetcode.cn/problems/invert-binary-tree/题目叙述:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]思路这道......
  • 24暑假算法刷题 | Day20 | LeetCode 235. 二叉搜索树的最近公共祖先,701. 二叉搜索树中
    目录235.二叉搜索树的最近公共祖先题目描述题解701.二叉搜索树中的插入操作题目描述题解450.删除二叉搜索树中的节点题目描述题解235.二叉搜索树的最近公共祖先点此跳转题目链接题目描述给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度......
  • 24暑假算法刷题 | Day21 | LeetCode 669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜
    目录669.修剪二叉搜索树题目描述题解108.将有序数组转换为二叉搜索树题目描述题解538.把二叉搜索树转换为累加树题目描述题解669.修剪二叉搜索树点此跳转题目链接题目描述给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉......
  • YC322A [ 20240724 CQYC NOIP 模拟赛 T3 ] 小 M 的字符串(string)
    题意给定一个\(0/1\)字符串,你需要从中选出尽可能多的不相交的子串使得按顺序字典序单调递增。\(n\le25000\)。Sol先考虑能最多选出多少个不相交的子串,这个是\(\frac{n}{\logn}\),但是这个没用。考察一下子串的长度,由于字典序的限制,最劣的情况下就是一个子串比上一个子串......
  • ESP32各型号模组进入下载模式的引脚配置及其自动下载电路
    1.自动下载电路 不同型号的ESP32模组的自动下载电路都相同,只是RST/EN,Boot引脚的引脚号不同,例如ESP32-C3的Boot脚为GPIO9而ESP32-Wroom-32的boot脚为GPIO0 上图为ESP32和ESP8265的自动下载电路2.进入下载模式的引脚配置 一般只有自动下载电路是不能在下载模式和运行模式来......
  • 学习STM32的SPI总线通信
    学习STM32的SPI总线通信需要了解SPI的基本原理和STM32的库函数使用方法。SPI(SerialPeripheralInterface)是一种全双工的同步串行通信总线,用于在微处理器或微控制器与外围设备之间传输数据。在STM32中,SPI总线通信需要使用SPI外设和相关的库函数。SPI外设包括多个SPI控制器,每个......
  • STM32入门教程:LED闪烁
    STM32是一款流行的微控制器系列,具有广泛的应用领域。在本教程中,我们将介绍如何使用STM32来控制LED灯的闪烁。第一步:准备工作在开始编写代码之前,我们需要准备一些必要的工具和材料。首先,我们需要一款能够编程的STM32微控制器开发板,例如ST-LinkV2。其次,我们需要一个集成开发......
  • 使用STM32实现简单的网络通信
    概述在本文中,我们将介绍如何使用STM32微控制器实现简单的网络通信。我们将使用STM32Cube软件来配置和编程STM32微控制器。我们将使用TCP/IP协议栈,以便在STM32微控制器与计算机之间进行通信。我们将通过创建一个简单的服务器端和一个客户端来演示网络通信的实现。准备工作在......