博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode每天一题】Longest Valid Parentheses(最长有效括弧)
阅读量:5825 次
发布时间:2019-06-18

本文共 2550 字,大约阅读时间需要 8 分钟。

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

Example 1:             Input: "(()"                         Output: 2                      Explanation: The longest valid parentheses substring is "()"

Example 2:            Input: ")()())"                   Output: 4                      Explanation: The longest valid parentheses substring is "()()"

 思路


  这道题一开始我想到的是使用辅助空间栈来解决这个问题,我们在栈中存储下标,然后将匹配的括弧弹出,然后使用当前下标减去栈中最上面元素的下标得到长度,如果栈为空的话,我们移动index表示到当前下标。直到遍历完毕。时间复杂度位O(n),空间复杂度为O(n)

  第二种思路是使用动态规划,我们设置一个辅助数组,然后对应元素的下标存储当前的有效长度,一直遍历到最后,返回数组中最长的长度。当遍历到i位置为')'时,我们判断i-1的位置是否是'(',接下来判断i-2是否大于等于0(因为小标为2的前面不会存在可以匹配的字符)。如果i-1的位置不为'(',就会存在'(())'这种情况,所以需要需要对前面的s[i-dp[i-1]-1] 位检查是否是 '('。之后继续判断下标大小是否满足。时间复杂度为O(n),空间复杂度为O(n)。

第一种思路图示


           

第二种思路的图示


  

    

  

  

第一种实现代码


 

1 class Solution: 2     def longestValidParentheses(self, s): 3         """ 4         :type s: str 5         :rtype: int 6         """ 7         max_len, index = 0, -1    # 最大长度和下标 8         stack = []                  # 辅助栈 9         for i , char in enumerate(s):   # 从第一个元素开始进行遍历10             if char == '(':       # 等于'('时添加进栈中11                 stack.append(i)12             else:13                 if stack:        #  先判断栈是否为空14                     stack.pop()  # 淡出与之匹配的'('元素15                     if stack:   # 弹出之后在进行判断16                         max_len = max(max_len, i - stack[-1])   # 不为空直接减去最上面元素的下标算出最大长度17                     else:18                         max_len = max(max_len, i - index)            19                 else:20                     index = i        # 将下标指向当前下标21         return max_len

 第二种思路实现代码


 

1 class Solution(object): 2     def longestValidParentheses(self, s): 3         """ 4         :type s: str 5         :rtype: int 6         """ 7         if len(s) < 2: 8             return 0 9         dp = [0]* len(s)           # 辅助数组10         for i in range(1, len(s)):    # 从第一个开始遍历11             if s[i] == ')':           12                 if s[i-1] =='(':      # 判断前一个是否是'('13                     if i - 2 >=0:      # 判断下标是否大于214                         dp[i] = dp[i-2] + 2      # 大于2的话,将前面的最长有效括弧长度加起来。15                     else:16                         dp[i]= 2                  # 否则就是217                 elif (i -dp[i-1]) > 0 and s[i-dp[i-1]-1] == '(':   # 对于'))'这种情况进行判定,18                     if i -dp[i-1] -2 >= 0:              # 加上之前最长的有效括弧19                         dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2]20                     else:21                         dp[i] = 2+ dp[i-1]               # 否则直接用前面一个进行增加。22         return max(dp)

转载于:https://www.cnblogs.com/GoodRnne/p/10676111.html

你可能感兴趣的文章
View之Canvas,Paint,Matrix,RectF等介绍
查看>>
苹果文档 UISearchController的介绍
查看>>
NB-IoT 的“前世今生”
查看>>
《小决心》作者Caroline Arnold:你的决心为什么总是以失败告终
查看>>
Kotlin 中 有趣 好玩的高阶函数
查看>>
传闻 Android Q 将支持手机应用版本回滚
查看>>
Spring+Hiberate 多数据源的网文整理
查看>>
C#动态创建Xml-LinQ方式
查看>>
光盘 iso 镜像制作相关命令操作
查看>>
力特ZE398C驱动光盘-USB转RS232-支持Windows 10/Mac
查看>>
解密“达达-京东到家”的订单即时派发技术原理和实践
查看>>
《Springboot极简教程》使用@SpringBootApplication annotation
查看>>
CSS 布局小结
查看>>
智能硬件的时代,嵌入式是否已经日薄西山
查看>>
单点登录(SSO)看这一篇就够了
查看>>
SpringBoot-Shiro使用
查看>>
分布式理论:CAP是三选二吗?
查看>>
iOS 9.0之后NSString encode方法替换
查看>>
解决 ThinkPHP5 无法接收 客户端 Post 传递的 Json 参数
查看>>
ASMFD (ASM Filter Driver) Support on OS Platforms (Certification Matrix). (文档 ID 2034681.1)
查看>>