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)

相关推荐
setmoon21417 小时前
多协议网络库设计
开发语言·c++·算法
Sylvia-girl17 小时前
删除有序数组中的重复项
数据结构·算法
2501_9083298517 小时前
嵌入式LinuxC++开发
开发语言·c++·算法
Storynone17 小时前
【Day30】卡码网:46. 携带研究材料,LeetCode:416. 分割等和子集
python·算法·leetcode
少许极端17 小时前
算法奇妙屋(三十四)-贪心算法学习之路 1
学习·算法·贪心算法
兑生17 小时前
【灵神题单·贪心】3010. 将数组分成最小总代价的子数组 I | Java
java·开发语言·算法
垫脚摸太阳17 小时前
二分查找经典算法题--数的范围
数据结构·算法
噜啦噜啦嘞好17 小时前
算法篇:二分查找
数据结构·c++·算法·leetcode
setmoon21417 小时前
C++中的构建器模式
开发语言·c++·算法
2301_8154829317 小时前
C++中的桥接模式变体
开发语言·c++·算法