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

LeetCode hot 100—最长有效括号

题目

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

示例

示例 1:

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

示例 2:

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

示例 3:

输入:s = ""
输出:0

分析

可以使用动态规划的方法来解决这个问题。我们定义一个数组 dp,其中 dp[i] 表示以 s[i] 结尾的最长有效括号子串的长度。

动态规划

代码解释

初始化n 为字符串 s 的长度。dp 数组初始化为 0,长度为 nmaxLength 用于记录最长有效括号子串的长度,初始化为 0。

动态规划过程

  • 遍历字符串 s,从第二个字符开始(因为第一个字符不可能组成有效括号子串)。
  • 如果当前字符是 )
    • 情况一:如果前一个字符是 (,则可以与前一个字符组成一对有效括号。此时 dp[i] 等于 dp[i - 2](如果 i >= 2)加上 2。
    • 情况二:如果前一个字符也是 ),则需要检查更前面的字符是否能组成有效括号。如果 i - dp[i - 1] > 0 且 s[i - dp[i - 1] - 1] == '(',则 dp[i] 等于 dp[i - 1] 加上 dp[i - dp[i - 1] - 2](如果 i - dp[i - 1] >= 2)再加上 2。
  • 更新 maxLength 为 dp[i] 和 maxLength 中的较大值。

返回结果

  • 最后返回 maxLength,即最长有效括号子串的长度。

时间复杂度:O(n),n 是字符串的长度

空间复杂度:O(n)

class Solution {
public:int longestValidParentheses(string s) {int n = s.length();if (n == 0) return 0;// dp[i] 表示以 s[i] 结尾的最长有效括号子串的长度vector<int> dp(n, 0);int maxLength = 0;for (int i = 1; i < n; ++i) {if (s[i] == ')') {if (s[i - 1] == '(') {// 如果当前字符是 ')' 且前一个字符是 '(',则可以与前一个字符组成一对有效括号dp[i] = (i >= 2? dp[i - 2] : 0) + 2;} else if (i - dp[i - 1] > 0 && s[i - dp[i - 1] - 1] == '(') {// 如果当前字符是 ')' 且前一个字符也是 ')',则需要检查更前面的字符是否能组成有效括号dp[i] = dp[i - 1] + (i - dp[i - 1] >= 2? dp[i - dp[i - 1] - 2] : 0) + 2;}maxLength = max(maxLength, dp[i]);}}return maxLength;}
};
http://www.xdnf.cn/news/1803.html

相关文章:

  • 【FAQ】安装Agent的主机,为何不能更改显示分辨率
  • CVE-2025-32102 | Ubuntu 下复现 CrushFTP telnetSocket接口SSRF
  • dataType 和 content-type 参数的作用
  • 补4月22日23日
  • Sentieon软件发布V202503版本
  • 首版次软件产品有哪些阶段?专业软件测试服务公司分享
  • 使用String path = FileUtilTest.class.getResource(“/1.txt“).getPath(); 报找不到路径
  • Spring Boot 中配置线程池时优化 `ThreadPoolTaskExecutor` 的配置总结
  • DDL小练习
  • Java小公司实习面经
  • python字符串(3):字符集/编码(查看修改字符集,乱码);码点和字符的转换(chr和ord),字符串的编码解码函数(encode,decode)
  • Dockerfile指令
  • JavaScript 实现继承及 Class 本质详解
  • 【Python Web开发】02-Socket网络编程02
  • Java 高频面试题解析
  • Langchain提取结构化数据
  • 第九节:性能优化高频题-首屏加载优化策略
  • JS Array 方法 | 区分 slice 和 splice
  • `rfind()` 从字符串的右侧开始查找指定子字符串首次出现的位置
  • SiamFC算法深度解析
  • 深入浅出:Pinctrl与GPIO子系统详解
  • SpringCloud微服务架构设计与实践 - 面试实战
  • C语言别踩白块附源码
  • Trae+DeepSeek学习Python开发MVC框架程序笔记(四):使用sqlite存储查询并验证用户名和密码
  • 现代化个人博客系统 ModStartBlog v10.3.0 博客批量操作,博客评论智能审核,安全升级
  • 某大型电解铝厂电解系统谐波治理装置改造沃伦森电气
  • Linux之七大难命令(The Seven Difficult Commands of Linux)
  • U盘能识别但无法写入数据的原因
  • CSS学习笔记8——表格
  • STM32F103C8T6 GPIO 通讯原理与物理层解析