当前位置: 首页 > news >正文

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

32. 最长有效括号

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

https://leetcode.cn/problems/longest-valid-parentheses/

2.方法二:栈

在这里插入图片描述

class Solution {
public:
    int longestValidParentheses(string s) {
        int max_len = 0, cur_len = 0;
        stack<pair<char,int>> sub_s;
        sub_s.push({' ',-1 });
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(') {
                sub_s.push({'(',i});
            }
            else {
                // 如果是)的话
                if (sub_s.top().first == -1) {
                    // 不可能出现匹配了,记录失配点
                    sub_s.push({ ')',i });
                }
                else {
                    // 栈里有个(
                    if (sub_s.top().first == '(') {
                        sub_s.pop();
                        cur_len = i - sub_s.top().second;
                        if (max_len < cur_len) {
                            max_len = cur_len;
                        }
                    }
                    else {
                    // 否则失配
                        sub_s.push({ ')',i });
                    }

                }
            }
        }
        return max_len;
    }
};

1.方法一:动态规划

在这里插入图片描述

在这里插入图片描述

class Solution {
public:
    int longestValidParentheses(string s) {
        if (s.size() <= 1) {
            return 0;
        }
        vector<int> dp(s.size());
        dp[0] = 0;
        int max_len = 0;
        for (int i = 1; i < s.size(); i++) {
            if (s[i] == ')' && s[i - 1] == '(') {
            	// 是()()()这样连着的,就可以逐个累积
                if (i > 2) {
                    dp[i] = 2 + dp[i - 2];
                } else {
                    dp[i] = 2;
                }
            } else if (s[i] == ')' && s[i - 1] == ')') {
            	// ……)) 这样的样子,可能是
            	// 情况1:()) 不匹配
            	// 情况2:(()) 匹配了并且前面没有可以匹配的了
            	// 情况3:()()()(())匹配而且前面还有可以匹配的
                if (i - dp[i - 1] - 1 >= 0 && s[i - dp[i - 1] - 1] == '(') {
                    if (i - dp[i - 1] - 2 >= 0) {
                        dp[i] = dp[i - dp[i - 1] - 2] + 2 + dp[i - 1];
                    } else {
                        dp[i] = dp[i - 1] + 2;
                    }
                } else {
                    dp[i] = 0;
                }
            } else {
                dp[i] = 0;
            }
            if (max_len < dp[i]) {
                max_len = dp[i];
            }
        }
        return max_len;
    }
};

方法三:贪心算法

我觉得这个方法有点类似这个题的算法:

【算法day19】括号生成——数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合

也就是说,通过判断左右括号的数量来判断是否匹配
在这里插入图片描述

但是这个算法没有考虑()(((()的情况,这个显然左括号很多,但是右括号严重缺少。
所以我们从右往左再类似地看一次,这次判断 ,左括号数大于右括号数,就失配,令当前匹配数量为0.

在这里插入图片描述

class Solution {
public:
    int longestValidParentheses(string s) {
        int cur_len = 0, max_len = 0;
        int left_num = 0, right_num = 0;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(') {
                ++left_num;
            } else if (s[i] == ')') {
                ++right_num;
            }
            if (right_num > left_num) {
                right_num = 0;
                left_num = 0;
            } else if(right_num==left_num){
                cur_len = 2 * min(left_num, right_num);
                if (cur_len > max_len) {
                    max_len = cur_len;
                }
            }
        }
        left_num = 0, right_num = 0;
        for (int i = s.size() - 1; i < s.size(); i--) {
            if (s[i] == '(') {
                ++left_num;
            } else if (s[i] == ')') {
                ++right_num;
            }
            if (right_num < left_num) {
                right_num = 0;
                left_num = 0;
            } else if (right_num == left_num) {
                cur_len = 2 * min(left_num, right_num);
                if (cur_len > max_len) {
                    max_len = cur_len;
                }
            }
        }
        return max_len;
    }
};
http://www.dtcms.com/a/98340.html

相关文章:

  • [Raspberry Pi]如何將看門狗(WatchDog)服務建置在樹莓派的Ubuntu作業系統中?
  • 查看openjdk源码
  • TDengine 中的异常恢复
  • 北斗导航 | 基于因子图优化的GNSS/INS组合导航完好性监测算法研究,附matlab代码
  • pyinstaller 对 pyexecjs模块打包老会有终端框闪烁
  • 【学Rust写CAD】18 定点数2D仿射变换矩阵结构体(MatrixFixedPoint结构别名)
  • 基于深度学习的手势识别系统设计
  • 3. 第三放平台部署deepseek
  • 部署堆叠+链路聚合架构,解锁网络高可用新体验
  • AGV-----RCS基础任务发布
  • 22_js运动函数
  • 历史数据分析——宝钢
  • AI赋能单片机开发的环节与方法
  • 观察者模式:解耦对象间的依赖关系
  • 【嵌入式学习3】多任务编程
  • (二)万字长文解析:deepResearch如何用更长的思考时间换取更高质量的回复?各家产品对比深度详解
  • 锐评|希捷NVMe闪存+磁盘混合存储阵列
  • AB包介绍及导出工具实现+AB包资源简单加载
  • Flutter和React Native在开发app中,哪个对java开发工程师更适合
  • 如何看待职场中的“向上管理”
  • c中的变量命名规则
  • 【精修版】【中项】系统集成项目管理工程师:第12章 项目进度管理-12.4估算活动持续时间
  • Python爬虫:开启数据抓取的奇幻之旅(一)
  • 点云库(Point Cloud Library, PCL)
  • 蓝桥复习 1(Init)
  • TCP网络编程与多进程并发实践
  • STM32_HAL开发环境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】
  • buildroot(1) -- 编译过程记录
  • [ 工具使用指南 ] | Visual Studio 2019 调试
  • 计算机底层基石:原码、反码、补码、移码深度剖析