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)

相关推荐
用户938515635072 小时前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC3 小时前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥3 小时前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
地平线开发者5 小时前
Transformer模型部署之性能优化指南
算法
地平线开发者5 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶
半个落月8 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
小月土星9 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
小月土星9 小时前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试
To_OC1 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode