首页 > 其他分享 >32. 最长有效括号

32. 最长有效括号

时间:2023-02-13 23:46:12浏览次数:64  
标签:int 32 括号 ans 字符串 最长 dp

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

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

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

示例 3:
输入:s = ""
输出:0

题目分析

显然,该问题满足最优子结构特性,因此可以采用动态规划方法求解。令\(dp[i]\)表示以下标为\(i\)结尾的字符串(之所以这样设计状态,是为了满足无后效性),初始时\(dp\)数组全部赋值为0。
接下来考虑状态转移方程:由题意可知,若字符串以"("结尾,那必然是格式不正确的字符串,故长度为0,因此只需要考虑以")"结尾的字符串。
如果\(s[i]=')' \&\& s[i - 1]='('\),即字符串形如\(...()\),那么\(dp[i]=dp[i-2]+2\),
如果\(s[i]=')' \&\& s[i - 1]=')'\),即字符串形如\(...))\),那么需要再进行一步判断,即如果\(s[i-dp[i-1]-1]='('\),那么这就是一个合法的字符串。但是进行状态转移时需要注意到直接连接在该字符串之前的合法字符串,也要将其的长度给加上,即\(dp[i]=dp[i-1]+2+dp[i-dp[i-1]-2]\)。
代码如下:

class Solution {
public:
    int longestValidParentheses(string s) {
        int ans = 0;
        int n = s.size();
        vector<int> dp(n, 0);
        for (int i = 1; i < n; i++) 
        {
            if (s[i] == ')') 
            {
                if (s[i - 1] == '(') 
                {
                    dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
                } 
                else if (i - dp[i - 1] - 1 >= 0 && s[i - dp[i - 1] - 1] == '(') 
                {
                    dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
                }
                ans = max(ans, dp[i]);
            }
        }
        return ans;
    }
};

时间复杂度\(O(n)\),空间复杂度\(O(n)\)

标签:int,32,括号,ans,字符串,最长,dp
From: https://www.cnblogs.com/parallel-138/p/17117713.html

相关文章

  • 新建STM32CubeMX工程
         HSE:外部高速时钟;LSE:外部低速时钟;MCO:芯片外部输出时钟PLL:锁相环;SYSCLK:系统时钟; 1.新建一个文件夹   2.打开STM32cubemx新建一个工程  ......
  • STM32CubeMX操作
    1.更改库安装路径    2.下载库  这里下载F1 ......
  • STM32CubeMX安装
    STM32CubeMX下载及安装教程1前言1.1基本介绍1.2主要特点1.3准备工作2软件下载2.1Java官网下载2.2CubeMX官网下载2.3云盘下载3软件安装3.1Java安装3.2CubeMX......
  • ESP32-S2使用串口接收数据帧 -- 解决串口缓存溢出问题
    ESP32S2串口接受数据帧时缓存溢出问题解决工况在使用ESP32S2作为单片机使用时,通过串口接收定时发送数据帧,会出现不定时的栈溢出问题。解决方案定时清理串口缓存,保证缓......
  • 最长上升子序列(LIS)
    动态规划:最长上升子序列(LIS)转载请注明原文地址:http://www.cnblogs.com/GodA/p/5180560.html学习动态规划问题(DP问题)中,其中有一个知识点叫最长上升子序列(longest......
  • 最长公共子序列(模板 LCSL)
    博客: https://www.cnblogs.com/sasuke-/p/5396843.html模板#include<iostream>#include<cstdio>#include<cstring>#defineMAXN1010usingnamespacestd;intc[MAXN][M......
  • esp32用microPython点亮WS2812B彩灯
    ██████╗███████╗██████╗██╗██╗███████╗██╔═══██╗██╔════╝██╔══██╗╚██╗██╔╝██╔═══......
  • stm32部署开发程序
    stm32嵌入式开发的流程如下:1.下载安装程序环境2.依照需求文档和硬件原理图用CubeMX配置引脚3.依据架构方案,搭建基础架构,添加程序功能一、下面开始讲述程序环境的安......
  • Java 生成 32位 UUID
    Java生成32位UUIDUUID:UniversallyUniqueIdentifier通用唯一识别码现在很多数据库的主键id,由原来的int自增,改为UUID表示。因为UUID本身不可能重复,线程安全,完美......
  • 华大电子MCU CIU32L061x8存储器(Flash)一
    5、Flash存储器(Flash)5.1简介Flash存储器连接在AHB总线上,由Flash控制器统一管理,可对存储器执行取指、读取、编程和擦除操作,并具有安全访问机制和读写保护等功能......