LeetCode热题100 最长有效括号

题目描述

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

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

示例 1:

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

示例 2:

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

示例 3:

输入 :s = ""
输出:0

提示:

0<=s.length<=3∗1040 <= s.length <= 3 * 10^40<=s.length<=3∗104

si 为 '(' 或 ')'

思路

使用动态规划,考虑以每个位置结尾的答案最大值。具体的步骤见代码。

代码

cpp 复制代码
class Solution {
public:
    int longestValidParentheses(string s) {
        int n = s.length();
        vector<int> dp(n); // 以i结尾的答案最大值

        int res = 0;
        for(int i = 0; i < n; ++i)
        {
            // (结尾的不是答案
            if(s[i] == ')') 
            {
                // 上一个是(, 直接合并
                if(i > 0 && s[i - 1] == '(')
                {
                    dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
                }
                // 上一个是), 看看上一个合并的前一个数不是(, 是的话可以合并
                else if(i > 0 && s[i - 1] == ')' && i - dp[i - 1] - 1 >= 0 && s[i - dp[i - 1] - 1] == '(' )
                {
                    dp[i] = dp[i - 1] + (i - dp[i - 1] - 2 >= 0 ? dp[i - dp[i - 1] - 2] : 0) + 2;
                }
            }
            res = max(res, dp[i]);
        }

        return res;
    }
};
相关推荐
Lucis__16 分钟前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc
Jared_devin1 小时前
单头、多头 Self-Attention可视化
人工智能·pytorch·深度学习·算法·机器学习·pycharm
Jackson_GJH1 小时前
C++虚函数、虚继承、虚基类
c++·c++基础
wuyk5551 小时前
18.Kruskal 算法:用最短的边连成一张网
开发语言·算法·图论
码匠许师傅1 小时前
【C++三方组件】开篇总论:为什么需要以及如何选型?
开发语言·c++
h_a_o777oah1 小时前
【Games101】C++ 软光追:光线追踪的求交逻辑和 BVH 提效实现及代码实现细节
c++·计算机图形学·光线追踪·games101·bvh·求交算法·软件渲染
cvby2 小时前
C++11--右值引用和移动语义
开发语言·c++
pen-ai2 小时前
【优化方法】最小二乘:从误差平方到线性与非线性拟合
人工智能·算法·机器学习
xiangyun612 小时前
【408数据结构 03】线性表与顺序表:C++手写SeqList
开发语言·数据结构·c++
Q26433650233 小时前
【有源码】基于机器学习的电信网络诈骗话术语义识别与可视化分析系统 XGBoost算法+Hadoop+Spark
大数据·hadoop·算法·机器学习·spark·毕业设计·课程设计