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)

相关推荐
ShineWinsu3 小时前
对于数据结构:链式二叉树的超详细保姆级解析—中
数据结构·c++·算法·面试·二叉树·校招·递归
野蛮人6号3 小时前
力扣热题100道之207课程表
算法·leetcode·职场和发展
这周也會开心3 小时前
Map的遍历方式
数据结构·算法
无敌最俊朗@3 小时前
C++ 值类别与对象模型面试题(12)
算法
代码不停4 小时前
Java模拟算法题目练习
java·开发语言·算法
前端小L4 小时前
图论专题(二):“关系”的焦点——一眼找出「星型图的中心节点」
数据结构·算法·深度优先·图论·宽度优先
资深web全栈开发4 小时前
贪心算法套路解析
算法·贪心算法·golang
~~李木子~~4 小时前
贪心算法实验2
算法·贪心算法
FanXing_zl5 小时前
快速掌握线性代数:核心概念与深度解析
线性代数·算法·机器学习