文章目录

  • 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;}
};

LeetCode 32. 最长有效括号(栈DP)相关推荐

  1. Leetcode 32 最长合法括号子序列

    算法特辑–动态规划 Leetcode 32 最长合法括号子序列 给定只有"(" 和 ")" 的字符串,求出最长的合法括号子序列. 例如:"())&qu ...

  2. leetcode:32. 最长有效括号

    32. 最长有效括号 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/longest-valid-parentheses/ 给你一个只包含 '(' 和 ...

  3. LeetCode 32最长有效括号(困难)

    维护不易,还请点个赞赞,如果想加入还请关注公众号bigsai回复进群加入打卡. 题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: &qu ...

  4. leetcode 32. 最长有效括号

    题目 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()& ...

  5. Leetcode 32.最长有效括号

    最长有效括号 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 " ...

  6. LeetCode 32 最长有效括号

    https://leetcode-cn.com/problems/longest-valid-parentheses/ 解决方案 class Solution {public int longestV ...

  7. 【LeetCode笔记】32. 最长有效括号(Java、动态规划、栈、字符串)

    文章目录 题目描述 代码 & 解析 1. 栈做法 2. 动态规划 题目描述 (括号题真的好烦人) 讲道理,题目一看,大概率就是用dp做 代码 & 解析 1. 栈做法 这个做法我没实际写 ...

  8. 32. 最长有效括号

    32. 最长有效括号 题目描述 给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度. 示例1: 输入:s = "(()" 输出:2 解释:最 ...

  9. LeetCode 718. 最长重复子数组(DP)

    1. 题目 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 示例 1: 输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的 ...

最新文章

  1. 2022斯坦福AI指数报告出炉!中国霸榜AI顶会,但引用量最低
  2. Top 10国际大厂人工智能岗位经典面试题精选
  3. Linux下 apache 配置 wsgi 以使用 python-flask (2016年2月)
  4. 拦截QT关闭窗口的CloseEvent
  5. css不换行属性_那些不常见,但却非常实用的 css 属性
  6. python分层聚类集群合并_24、python分层聚类案例(scipy方法)
  7. skywalking 安装_分布式监控系统SkyWalking
  8. session的工作原理【转】
  9. Android 资源(resource)学习小结
  10. python实现微信打飞机
  11. JavaScript中使用attachEvent实现事件监听
  12. h5.v2.php,最新H5影视双端PHP源码 可封装APP
  13. 英文对“ Big O”符号的解释是什么?
  14. 基于Neo4j构建的外贸企业关系图谱做企业相似度查询
  15. 解决 iphone6sp 换电池 电池胶断问题
  16. 2021 写博客指南·万字长文警告
  17. Wifi热点java_Wifi热点实现文件传输
  18. 【书影观后感 十二】沧浪之水清兮,可以濯我缨 沧浪之水浊兮,可以濯我足
  19. 企业微信三方开发(三):网页授权登录
  20. 计算机算法设计与分析(第五版)---王晓冬--------前六章(递归与分治,动态规划,贪心算法,回溯法,)期末复习资料总结

热门文章

  1. java看图_看图吧,Java
  2. invalid floating point operation什么意思_Point-MVSNet:基于多视角的点云重建网络
  3. s5pv210——定时器理论与操作
  4. pointcut 切面表达式 切入点表达式
  5. 【bzoj2806】 Ctsc2012—Cheat
  6. iOS 测试三方 KIF 的那些事
  7. ABP框架详解(八)动态ApiController的生成和访问机制
  8. SharePoint2010网站备份还原简单介绍
  9. 32位Windows系统未分页内存限制导致的VPS的容量问题
  10. 雅虎的Mash-up 之路