Title

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

示例 1:

输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”

示例 2:

输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”

Solve

括号匹配问题,第一个想到的数据结构就是栈,考虑到边界情况,要保持栈底元素为当前已经遍历过的元素中最后一个没有被匹配的右括号的下标,初始情况放入-1,栈里其他元素维护左括号的下标。

具体过程:

  • 如果遇到左括号,将其下标放入栈中
  • 如果遇到右括号:
    • 如果栈为空,说明当前的右括号为没有被匹配的右括号,我们将其下标放入栈中来更新我们之前提到的「最后一个没有被匹配的右括号的下标」
    • 如果栈不为空,当前右括号的下标减去栈顶元素即为「以该右括号为结尾的最长有效括号的长度」

Code

 def longestValidParentheses_stack(self, s: str) -> int:stack, ans = [-1], 0for i in range(len(s)):if s[i] == '(':stack.append(i)else:stack.pop()if not stack:stack.append(i)else:ans = max(ans, i - stack[-1])return ans

复杂度分析

时间复杂度: O(n),n 是给定字符串的长度。我们只需要遍历字符串一次即可。

空间复杂度: O(n)。栈的大小在最坏情况下会达到 n,因此空间复杂度为 O(n) 。

动态规划

Solve

定义dp数组并全部初始化为0,dp[i]表示以下标i字符结尾的最长有效括号的长度。

有效子串一定以右括号结尾,所有以左括号结尾的子串对应的dp值必定为0。

从前往后遍历字符串求解dp值,每两个字符检查一次:

  1. s[i]=’)’,s[i-1]=’(’,可以推出:dp[i]=dp[i−2]+2
  2. s[i]=’)’,s[i-1]=’)’,如果s[i−dp[i−1]−1]=’(’,可以推出:dp[i]=dp[i−1]+dp[i−dp[i−1]−2]+2

我们考虑如果倒数第二个 ‘)’ 是一个有效子字符串的一部分(记作 subs),对于最后一个 ‘)’ ,如果它是一个更长子字符串的一部分,那么它一定有一个对应的 ‘(’ ,且它的位置在倒数第二个 ‘)’ 所在的有效子字符串的前面(也就是 subs 的前面)。

因此,如果子字符串 subs 的前面恰好是 ‘(’ ,那么我们就用 2 加上 subs 的长度(dp[i−1])去更新 dp[i]。同时,我们也会把有效子串 “(subs)” 之前的有效子串的长度也加上,也就是再加上 dp[i−dp[i−1]−2]。

最后的答案即为 dp 数组中的最大值。

Code

 def longestValidParentheses_dp(self, s: str) -> int:length = len(s)if length == 0:return 0dp = [0] * lengthfor i in range(length):if s[i] == ')' and i - dp[i - 1] - 1 >= 0 and s[i - dp[i - 1] - 1] == '(':dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2return max(dp)

复杂度分析

时间复杂度: O(n),其中 n 为字符串的长度。我们只需遍历整个字符串一次,即可将 dp 数组求出来。

空间复杂度: O(n)。我们需要一个大小为 n 的 dp 数组。

32. Longest Valid Parentheses 最长有效括号相关推荐

  1. LeetCode 32. Longest Valid Parentheses

    问题链接 LeetCode 32. Longest Valid Parentheses 题目解析 给出只包含左右括号的字符串,返回最长的括号匹配字符串长度. 解题思路 括号匹配问题一般借助 栈,便于理 ...

  2. 32. Longest Valid Parentheses

    一.题目 1.审题 2.分析: 一个只包含'('.')'的字符串,求其中正确闭合的子串的最大长度. 二.解答 1.思路: 方法一: 从第一个字符开始遍历,依次求出从遍历的字符开始的最长闭合的字符串长度 ...

  3. 最长有效括号子串长度 c语言,LeetCode: Longest Valid Parentheses (求最长有效匹配括号子串的长度)...

    题目描述: Given a string containing just the characters'(' and')', find the length of the longest valid ...

  4. LeetCode Longest Valid Parentheses

    原题链接在这里:https://leetcode.com/problems/longest-valid-parentheses/ 题目: Given a string containing just ...

  5. Longest Valid Parentheses leetcode java

    题目: Given a string containing just the characters '(' and ')', find the length of the longest valid ...

  6. LeetCode算法入门- Longest Valid Parentheses -day12

    LeetCode算法入门- Longest Valid Parentheses -day12 Given a string containing just the characters '(' and ...

  7. 32 Longest Valid Parenthese

    32 Longest Valid Parenthese 题意 解法 代码 算法复杂度 注意 题目链接:32 Longest Valid Parenthese 题意 给出一个由字符'('或')'组成的字 ...

  8. Leetcode: Longest Valid Parentheses

    Question Given a string containing just the characters '(' and ')', find the length of the longest v ...

  9. leetcode32 Longest Valid Parentheses

    问题描述 * 找出字符串中最长的有效子串,字符串只包括'(' , ')'.何为有效,可参考leetcode20 判断一个字符串是否为有效字符串. 解题思路 介绍动态规划的解法 从倒数第二个元素往前遍历 ...

最新文章

  1. Flutter实战视频-移动电商-60.购物车_全选按钮的交互效果制作
  2. MongoDB trouble shoot sharded clusters
  3. 转载:【菜鸟玩Linux开发】通过MySQL自动同步刷新Redis
  4. Vue项目中使用svg文件
  5. leetcode combinations java_[LeetCode][Java] Combinations
  6. height:calc(100% - 10px)的用法(垂直居中) - 布局篇
  7. C#内存流示例-----gt;用内存流来读取图片
  8. 金融数据分析熟练使用Excel
  9. 第一百一十八天 how can I 坚持
  10. 智能家居告别荒蛮:机会与挑战并存
  11. C#4.0的十种语法糖
  12. Notepad++一键编译运行(Python、Java、C++)
  13. datetime只要年月python_Python 的日期和时间处理
  14. 阿铭Linux_网站维护学习笔记20190227
  15. vue学习笔记二:HBuilder X框架搭建
  16. imdb导mysql_IMDB电影排行爬取分析
  17. redux 多种触发dispatch方式
  18. 如何练成大力金刚指:IKBC - C104 白色黑轴机械键盘 体验测评
  19. xp装html5,WindowsXP系统如何安装IIS5.1
  20. 不看你就亏了。。。。

热门文章

  1. meta viewport相关
  2. When.js 1.8.0 发布,Promises/A 的实现
  3. 小车自动往返工作原理_自动气象站的工作原理介绍
  4. 什么是实例对象python_python判断类型:想知道一个对象(实例或者变量)是什么类型,什么结构的...
  5. Java黑皮书课后题第8章:*8.32(几何:三角形面积)编写一个方法,使用下面的方法头,返回一个三角形的面积。编写一个程序,提示用户输入三角形的三个点,然后显示三角形的面积
  6. 2014届华为校园招聘机试题
  7. STL源码剖析---空间配置器
  8. [转贴] 软件测试职业发展的 A 面和 B 面
  9. 浅谈 温故知新——HTML5!
  10. 【 D3.js 入门系列 --- 9 】 常见可视化图形