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

Leetcode热题100-32 最长有效括号

Leetcode热题100-32 最长有效括号

  • 1. 题目描述
  • 2. 解题思路
    • 动态规划
    • 栈解法
  • 3. 代码实现
    • 动态规划
    • 栈解法

1. 题目描述

32 最长有效括号

2. 解题思路

动态规划

定义状态:

  • dp[i] 表示以位置 i 结尾的最长有效括号子串的长度。

状态转移方程:
遍历字符串 s,当遇到 s[i] == ')' 时,存在以下两种情况:

  1. 情况 1:s[i - 1] == '('
    • 当前字符 ')' 与前一个字符 '(' 组成了一对匹配的括号。
    • 更新状态:
      d p [ i ] = ( i ≥ 2 ? d p [ i − 2 ] : 0 ) + 2 dp[i] = (i \geq 2 ? dp[i - 2] : 0) + 2 dp[i]=(i2?dp[i2]:0)+2
  2. 情况 2:s[i - 1] == ')'
    • 需要满足条件:i - dp[i - 1] > 0,即前面存在可以与当前 ')' 匹配的 '('
      d p [ i ] = ( i − d p [ i − 1 ] ≥ 2 ? d p [ i − d p [ i − 1 ] − 2 ] : 0 ) + d p [ i − 1 ] + 2 dp[i] = (i - dp[i - 1] \geq 2 ? dp[i - dp[i - 1] - 2] : 0) + dp[i - 1] + 2 dp[i]=(idp[i1]2?dp[idp[i1]2]:0)+dp[i1]+2
    • 其中:
      • dp[i - dp[i - 1] - 2] 表示与当前匹配的 '(' 前面的有效子串长度(若存在,否则为 0)。
      • dp[i - 1] 是前一个位置的最长有效子串长度。
      • s[i - dp[i - 1] - 1]s[i] 匹配(长度为 2)。

更新最大值:
在遍历过程中,更新最大长度:
maxLen = max ⁡ ( maxLen , d p [ i ] ) \text{{maxLen}} = \max(\text{{maxLen}}, dp[i]) maxLen=max(maxLen,dp[i])
遍历结束后,maxLen 即为所求结果。

栈解法

初始化:

  • 使用一个栈 stk 存储索引。
  • -1 压入栈,表示最后一个未匹配的右括号的索引。

遍历字符串:

  • 遍历字符串中的每个字符:
    1. 如果当前字符为 '(',将其索引压入栈。
    2. 如果当前字符为 ')'
      • 弹出栈顶元素,表示尝试匹配最近的 '('
      • 如果栈为空,说明没有匹配的 '(',将当前索引压入栈。
      • 如果栈不为空,计算当前有效括号的长度,并更新最大长度 maxLen
        maxLen = max ⁡ ( maxLen , i − stack.top() ) \text{{maxLen}} = \max(\text{{maxLen}}, i - \text{{stack.top()}}) maxLen=max(maxLen,istack.top())

3. 代码实现

动态规划

class Solution {
public:// 使用栈来解决问题int longestValidParentheses(string s) {int maxLen = 0;int n = s.size();vector<int> dp(n, 0);// 注意到子串是指字符串中连续的字符序列for (int i = 1; i < n; i++) {if (s[i] == ')') {// 直接匹配if (s[i - 1] == '(') {dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;}// s[i-1]=')'else if (i - dp[i - 1] > 0 && s[i - dp[i - 1] - 1] == '(') {// dp[i-dp[i-1]-2]表示与dp[i-1]相连的有效子字符串的长度// dp[i]由三部分组成// s[i-dp[i-1]-1]与s[i]匹配(长度为2)// dp[i - 1]// dp[i - dp[i - 1] - 2]或者为0dp[i] = (i - dp[i - 1] >= 2 ? dp[i - dp[i - 1] - 2] : 0) +dp[i - 1] + 2;}}maxLen = max(maxLen, dp[i]);}return maxLen;}
};

栈解法

class Solution {
public:int longestValidParentheses(string s) {int res=0;stack<int> stk;stk.push(-1);for(int i=0;i<s.size();i++){if(s[i]=='('){stk.push(i);}else{stk.pop();if(stk.empty()){stk.push(i);}else{res=max(res,i-stk.top());}}}return res;}
};
http://www.lryc.cn/news/484812.html

相关文章:

  • 【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据
  • A027-基于Spring Boot的农事管理系统
  • Redisson的可重入锁
  • SQL Server Service Broker完整示例
  • CentOS7 升级OpenSSH9.0全过程和坑
  • RSTP的配置
  • 力扣257:二叉树的所有路径
  • Tcl 和 Python 在二次开发研究
  • 【NLP优化】Ubuntu 20.04 下 源码安装 CasADi + Ipopt / acados
  • [241110] 微软发布多智能体系统Magentic-One | 社区讨论:Ubuntu 26.04 LTS 发布前移除 Qt 5
  • AI风向标|算力与通信的完美融合,SRM6690解锁端侧AI的智能密码
  • MySQL查询执行(六):join查询
  • python习题练习
  • MySQL高级(二):一条更新语句是如何执行的
  • 在 Ubuntu 18.04 中搭建和测试 DNS 服务器
  • 算法学习第一弹——C++基础
  • javaWeb小白项目--学生宿舍管理系统
  • 如何优化Elasticsearch的查询性能?
  • 蓝桥杯每日真题 - 第12天
  • 从H264视频中获取宽、高、帧率、比特率等属性信息
  • Cyberchef配合Wireshark提取并解析TCP/FTP流量数据包中的文件
  • Nginx中使用keepalive实现保持上游长连接实现提高吞吐量示例与测试
  • 深度学习-卷积神经网络CNN
  • 241114.学习日志——[CSDIY] [Cpp]零基础速成 [03]
  • 大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载
  • 数据库SQL——什么是实体-联系模型(E-R模型)?
  • 在 MySQL 8.0 中,SSL 解密失败,在使用 SSL 加密连接时出现了问题
  • React Native 全栈开发实战班 - 第四部分:用户界面进阶之动画效果实现
  • 【CICD】GitLab Runner 和执行器(Executor
  • 实用教程:如何无损修改MP4视频时长