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

题目描述

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

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

示例

示例 1:

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

示例 2:

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

示例 3:

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

解法

1.动态规划

解题思路

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

相关推荐
aWty_1 分钟前
实分析入门(11)--Cantor三分集
学习·数学·算法·实变函数
兰令水1 分钟前
leecodecode【二叉树递归+对称】【2026.6.1打卡-java版本】
算法
地平线开发者8 小时前
profiler debug 工具用法与高一致性策略
算法·自动驾驶
编程大师哥8 小时前
匿名函数 lambda + 高阶函数
java·python·算法
我叫袁小陌9 小时前
算法解题思路指南
算法
地平线开发者9 小时前
Conv+BN+Add+ReLU 融合机制简介
算法·自动驾驶
yuanyuan2o29 小时前
模型预训练:Hugging Face Transformers 基础
算法·ai·语言模型·自然语言处理·nlp·深度优先
杨充9 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
妄想出头的工业炼药师10 小时前
GS slam mono
算法·开源