LeetCode 32. 最长有效括号(困难)

题目描述

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

左右括号匹配,即每个左括号都有对应的右括号将其闭合的字符串是格式正确的,比如 "(()())"

示例

示例 1:

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

示例 2:

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

示例 3:

复制代码
输入:s = ""
输出:0

解法

1.动态规划

解题思路

定义一个dp数组,其中dp[i]表示以第i个字符结尾的最长有效括号子串长度。当遇到右括号时,分为两种情况处理:如果前一个字符是左括号,形成"()"直接配对,则dp[i] = dp[i-2] + 2;如果前一个字符也是右括号,则向前回溯dp[i-1]长度,找到可能的匹配左括号位置,若匹配成功则dp[i] = dp[i-1] + dp[匹配左括号前一位] + 2。最终结果是dp数组中的最大值。

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

时间复杂度O(N),空间复杂度O(N)

相关推荐
灵感__idea20 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP2 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP3 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试