LeetCode 32. 最长有效括号(栈DP)

文章目录

    • 1. 题目信息
    • 2. 栈 解题
    • 3. 动态规划 解题

1. 题目信息

给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 栈 解题

括号匹配一般都可以用栈解决,这题是把相关的元素的下标出入栈

  • 先把 -1push入栈
  • 遇见( ,push其下标入栈
  • 遇见 ),先弹栈后,如果栈不为空,则匹配了,匹配长度count为当前 i-top,记录最大的count即为答案
  • 如果栈为空,就把未匹配的 )下标压栈

在这里插入图片描述

class Solution
{
public:int longestValidParentheses(string s){int count = 0, maxlen = 0;stack<int> stk;stk.push(-1);for(int i = 0; i < s.size(); ++i){if(s[i] == '('){stk.push(i);}else    // s[i] == ')'{stk.pop();if(!stk.empty()){count = i-stk.top();if(count > maxlen)maxlen = count;}elsestk.push(i);}}return maxlen;}
};

3. 动态规划 解题

dp[i]表示包含第下标 i 个字符的情况下,该子串匹配的最大长度

  • s[i] = '(' 时,这个子串肯定没有匹配,记dp[i] = 0,所以dp数组初始化为0
  • 所以我们只要更新s[i] = ')' 时的dp[i]的值

分两种情况

  1. s[i] = ')' && s[i-1] = '(',那说明 dp[i] = dp[i-2] + 2
  2. s[i] = ')' && s[i-1] = ')',在字符 i-1处,匹配了dp[i-1] 个字符,那么再往前一个字符的下标 k 是 i-1-dp[i-1],
  • 检查s[k],如果其为 ‘(’ ,那么下标 i 元素跟 s[k] 匹配了,再检查下 k - 1处的匹配长度 dp[k],需要把他也加起来,则 dp[i] = dp[i-1] + dp[k-1] + 2,如果 k-1 < 0,则忽略 dp[k-1] 项
  • 如果 s[k] 为 ‘)’,那么下标 i 元素与 s[k] 未匹配,则包含 s[i]的子串是不匹配的,所以 dp[i] = 0(已初始化0,不必更新dp数组)

在这里插入图片描述

class Solution
{
public:int longestValidParentheses(string s)// DP解法{if(s.size() <= 1)return 0;int dp[s.size()];int maxlen = 0, k, i;memset(dp,0,s.size()*sizeof(int));for(i = 1; i < s.size(); ++i){if(s[i] == ')'){if(s[i-1] == '('){if(i >= 2)dp[i] = dp[i-2] + 2;elsedp[i] = 2;}else// s[i-1] = ')'{k = i-1-dp[i-1];if(k >= 0 && s[k] == '('){if(k >= 1)dp[i] = dp[i-1] + dp[k-1] + 2;elsedp[i] = dp[i-1] + 2;}}}}for(i = 0; i < s.size(); ++i){if(dp[i] > maxlen)maxlen = dp[i];}return maxlen;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息中间件系列(四):消息队列MQ的特点、选型、及应用场景详解

前面集中谈了分布式缓存Redis系列&#xff1a; 高并发架构系列&#xff1a;分布式锁的由来、特点、及Redis分布式锁的实现详解 高并发架构系列&#xff1a;Redis并发竞争key的解决方案详解 高并发架构系列&#xff1a;Redis缓存和MySQL数据一致性方案详解 Redis的高可用详解…

基金定投

https://www.zhihu.com/question/19909886 相信我&#xff0c;这篇攻略能让你彻底搞懂基金&#xff0c;每年大概率能赚10%左右的收益&#xff01;基金定投核心要搞懂两个问题&#xff1a;买什么基金&#xff0c;什么时候买。今天我给大家一篇文章讲透这两个问题&#xff01;我说…

卖萌屋学术站发布!通往高效刷论文之路

文 | 夕小瑶编 | 兔子酱学术站诞生好久没有冒泡啦&#xff0c;大家还记得雁栖湖畔的夕小瑶吗&#xff01;&#xff08;划掉(*/ω&#xff3c;*)趁着国庆假期&#xff0c;跟卖萌屋小伙伴们终于把拖延已久的《Arxiv神器》翻新了&#xff0c;零零星星做了几个月&#xff0c;最近终…

消息中间件系列(五):MQ消息队列的12点核心原理总结

消息队列已经逐渐成为分布式应用场景、内部通信、以及秒杀等高并发业务场景的核心手段&#xff0c;它具有低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。 无论是 RabbitMQ、RocketMQ、ActiveMQ、Kafka还是其它等&#xff0c;都有的一些基本原理、术语、机制等&…

征稿 | 2019年全国知识图谱与语义计算大会(CCKS2019)投稿时间延长

全国知识图谱与语义计算大会&#xff08;CCKS: China Conference on Knowledge Graph and Semantic Computing&#xff09;由中国中文信息学会语言与知识计算专业委员会组织和承办。全国知识图谱与语义计算大会是两个全国性会议的合并&#xff1a;中文知识图谱研讨会the Chines…

LeetCode 641. 设计循环双端队列

文章目录1. 题目信息2. 解题1. 题目信息 设计实现双端队列。 你的实现需要支持以下操作&#xff1a; MyCircularDeque(k)&#xff1a;构造函数,双端队列的大小为k。 insertFront()&#xff1a;将一个元素添加到双端队列头部。 如果操作成功返回 true。 insertLast()&#xff…

代码逆流成河,深入C++如何又快又有效?

虽然编程语言有很多&#xff0c;但在需要顶级性能的项目上&#xff0c;基本都会使用C。尤其是机器人、自动驾驶、AI等嵌入和实时系统&#xff0c;都是C的主要应用方向&#xff0c;在这种层面&#xff0c;几乎没有竞争者。比如熊厂的搜索引擎、推荐引擎等核心产品&#xff0c;鹅…

论文浅尝 | 混合注意力原型网络的含噪音少样本的关系分类

论文笔记整理&#xff1a;余海阳&#xff0c;浙江大学硕士&#xff0c;研究方向为知识图谱、自然语言信息抽取。链接&#xff1a;https://www.aaai.org/Papers/AAAI/2019/AAAI-GaoTianyu.915.pdf动机现有的关系分类方法主要依赖于远程监控&#xff08;DS&#xff09;&#xff0…

消息中间件系列(七):如何从0到1设计一个消息队列中间件

消息队列作为系统解耦&#xff0c;流量控制的利器&#xff0c;成为分布式系统核心组件之一。 如果你对消息队列背后的实现原理关注不多&#xff0c;其实了解消息队列背后的实现非常重要。 不仅知其然还要知其所以然&#xff0c;这才是一个优秀的工程师需要具备的特征。 今天…

LeetCode 239. 滑动窗口最大值(双端队列+单调栈)

文章目录1. 题目信息2. 解题2.1 暴力法2.2 双端队列法1. 题目信息 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例:输入: n…

Airbnb搜索:重排序阶段如何优化搜索结果多样性?

文 | 谷育龙Eric编 | QvQ我是谷育龙Eric&#xff0c;研究方向有深度学习、搜索推荐&#xff0c;喜欢为大家分享深度学习在搜索推荐广告排序应用的文章。本文将基于Airbnb KDD 2020年的论文&#xff0c;介绍Airbnb搜索排序中在重排序阶段如何解决多样性的问题&#xff0c;对工业…

肖仰华 | 做个“有知识”的机器人

本文转载自公众号:知识工场。肖仰华博士&#xff0c;复旦大学计算机科学与技术学院教授&#xff0c;博士生导师&#xff0c;知识工场实验室负责人。本文是肖仰华教授应《中国计算机学会通信》邀请所撰写的特邀文章&#xff0c;全文见 CCCF 2019 年第 5 期。摘要&#xff1a;时下…

消息中间件系列(九):详解RocketMQ的架构设计、关键特性、与应用场景

内容大纲&#xff1a; RocketMQ的简介与演进 RocketMQ的架构设计 RocketMQ的关键特性 RocketMQ的应用场景 RocketMQ的简介 RocketMQ一个纯java、分布式、队列模型的开源消息中间件&#xff0c;前身是MetaQ&#xff0c;是阿里研发的一个队列模型的消息中间件&#xff0c;后开…

LeetCode 151. 翻转字符串里的单词(栈)

文章目录1. 题目信息2. 解题1. 题目信息 给定一个字符串&#xff0c;逐个翻转字符串中的每个单词。 示例 1&#xff1a;输入: "the sky is blue" 输出: "blue is sky the" 示例 2&#xff1a;输入: " hello world! " 输出: "world! hel…

推荐系统架构与算法流程详解

文 | yijiapan腾讯 WXG 数据分析师推荐算法的理解如果说互联网的目标就是连接一切&#xff0c;那么推荐系统的作用就是建立更加有效率的连接&#xff0c;推荐系统可以更有效率的连接用户与内容和服务&#xff0c;节约了大量的时间和成本。如果把推荐系统简单拆开来看&#xff0…

论文浅尝 | 将字面含义嵌入知识图谱表示学习

论文笔记整理&#xff1a;吴桐桐&#xff0c;东南大学博士生&#xff0c;研究方向为知识图谱&#xff0c;自然语言处理。链接&#xff1a;https://arxiv.org/pdf/1802.00934.pdf本文主要关注知识图谱中的链接预测问题&#xff0c;在既有的知识图谱表示学习模型的基础上提出了一…

优知学院创始人陈睿:怎样做好一个创业公司CTO?

CTO 是企业内技术最高负责人&#xff0c;对企业的发展起到至关重要的作用。但随着公司的不断发展&#xff0c;CTO 的工作重心也会不断变化。只有在正确的阶段做正确的事&#xff0c;才能更好地为公司做出贡献。 本文作者&#xff1a;陈睿 优知学院创始人&#xff0c;10年产品技…

2020年深度学习调参技巧合集

文 | 山竹小果源 | NewBeeNLP编 | 夕小瑶的卖萌屋重点说明&#xff1a;本文主要为整理总结&#xff0c;大部分参考文末资料&#xff0c;感谢分享。寻找合适的学习率学习率是一个非常非常重要的超参数&#xff0c;这个参数呢&#xff0c;面对不同规模、不同batch-size、不同优化…

LeetCode 226. 翻转二叉树(DFS BFS)

文章目录1. 题目信息2. 解题2.1 DFS2.2 BFS1. 题目信息 翻转一棵二叉树。 示例&#xff1a;输入&#xff1a;4/ \2 7/ \ / \ 1 3 6 9输出&#xff1a;4/ \7 2/ \ / \ 9 6 3 1来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;…

论文浅尝 | GraphIE:基于图的信息抽取框架

笔记整理&#xff1a;吕欣泽&#xff0c;南京大学计算机科学与技术系&#xff0c;硕士研究生。论文连接&#xff1a;https://arxiv.org/pdf/1810.13083.pdf发表会议&#xff1a;NAACL 2019摘要大多数现代信息提取&#xff08;IE&#xff09;系统都是作为顺序标记器实现的&#…