维护不易,还请点个赞赞,如果想加入还请关注公众号bigsai回复进群加入打卡。

题目描述

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

示例 1:

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

示例 2:

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

分析
再看这题之前,咱们回顾一下前面刷过的题。力扣20有效的括号

分析

这种题核心思想就是使用栈模拟。本题的话更简单一点因为只有()两种括号,只有两个东西的话很多时候可以省略很多内容。在使用暴力的时候就可以循环每次找到最长的有效括号。而括号匹配的时候可以直接终止的情况是当前多个)右括号。例如())(到第三个不可能和前面相连,而如果来(只需要期待后面能够来)。一个)可以和一个(组成一对,消除栈中的一个(

当然,在具体的实现上,我们用数组模拟栈,实现代码为:

public  int longestValidParentheses(String s) {char str[]=s.toCharArray();//字符数组int max=0;for(int i=0;i<str.length-1;i++){int index=-1;if(max>=str.length-i)break;for(int j=i;j<str.length;j++){if(str[j]=='(')index++;else {if(index<0){i=j;break;}else {index--;}}if(index==-1&&(j-i+1>max)){max=j-i+1;}}}    return max;}

尽管有一些地方有优化空间,比如剪枝把各种不可能的给剪掉,但整个算法还是太复杂,算法的复杂度为O(n2).并且只击败5%的人,所以在这方面宣告算法宣告失败:

其实这个暴力是昨晚睡觉前过的, 因为我看到困难级别我在刷的时候用暴力过了好歹我也是过了,过了之后上床之后我就在想怎么去优化这道题。

在今天早上的时候用笔画了画想了想成功攻破该题(看不懂不要紧,下面给你慢慢讲):

如何将这道题从一个O(n2)的时间复杂度优化到O(n)?很容易, 我们需要注意他的过程。我们先随便看几个可能的最大情况。

  • ( ) ) ( ) ( ( ) ( ) ) 最大为后面部分
  • ( ) ( ) ( ( ( ) 最大为前面部分
  • ( ( ( ( ( ( ) ( ) ( ) ( ) 最大为后面部分

对于这么一次获取你会发现不同括号会有些区别:
(:左括号一旦出现那么他就期待一个)进行匹配,但它的后面可能有)并且在这中间有很多其他括号对。
):右扩号有两种情况:

  • 一种是当前已经超过左括号前面已经不可能连续了。例如( ) ) ( )第三个括号出现已经使得整个串串不可能连续,最大要么在其左面要么再其右面。 你可以理解其为一种清零初始机制。
  • 另一种情况)就是目标栈中存在(可与其进行匹配。匹配之后要叠加到消除后平级的数量上,并且判断是否是最大值。(下面会解释)

具体实现的思路上,就是使用一个int数组标记当前层级(栈深)有正确的括号数量。 模拟一次栈行为从左向右,遇到)太多(当前栈中不存在(进行匹配)就将数据清零重新开始。这样一直到最后。你可以把它看成台接,遇到(就上一个台阶并清零该新台阶,遇到)就下一个台阶并且把数量加到下降后的台阶上。具体可以看下面图片模拟呃过程:
( ) ( ( ) ( ) ( ( ) ) )

仔细看看这张图,具体实现代码为:

 public static int longestValidParentheses(String s) {int max=0;    int value[]=new int[s.length()+1];int index=0;for(int i=0;i<s.length();i++){if(s.charAt(i)=='('){index++;value[index]=0;}else {//")"if(index==0){value[0]=0;}else {value[index-1]+=value[index--]+2;//叠加if(value[index]>max)//更新max=value[index];}}}return max;}


好啦,这个O(n)的复杂度还行,至于其他解法也没研究有空可以看看。这次打卡就结束啦,如果有兴趣的欢迎关注公众号bigsai 回复进群,加入打卡!一起刷题。

LeetCode 32最长有效括号(困难)相关推荐

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

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

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

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

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

    文章目录 1. 题目信息 2. 栈 解题 3. 动态规划 解题 1. 题目信息 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1:输入: "(() ...

  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. 32. 最长有效括号

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

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

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

  9. [力扣]32. 最长有效括号(三解法)

    解法一:栈 class Solution:def longestValidParentheses(self, s: str) -> int:q = []st = -1res = 0for i i ...

最新文章

  1. ren`guang-boss面试
  2. 关于this的指向问题
  3. linux二进制数据16进制数据转换,[轉]16进制字符文本/二进制文件迷你互转器
  4. 花5000元买2天训练营,年轻人正在「高价买觉睡」
  5. 第二周代码(wc项目)
  6. 问题 J: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数
  7. Log4J文件路径设置
  8. 181130每日一句
  9. j2me解决模拟器乱码
  10. Access——SQL语言查询
  11. Win10无法安装 文鼎CS行楷.TTF
  12. opengl 中的透视除法和NDC
  13. 【Unity性能优化】ASTC压缩格式(Android)
  14. JAVA边界布局和setbound_深入探究frame和bounds的区别以及setbounds使用
  15. 表格比手机屏幕宽时不压缩,可左右滚动,格子内容不换行
  16. 黑客攻防与网络安全-N-0
  17. Sql Server级联操作
  18. 数商云助您“乘风破浪”,倾力打造PCB行业采购管理平台解决方案
  19. 贝壳房产问答匹配比赛-划水之旅
  20. win10版本查看_不知道电脑上安装的win10版本,这样操作可以轻松查看

热门文章

  1. EOS 智能合约源代码解读 (10)token合约“简介”
  2. 区块链BaaS云服务(39)时戳信息Bystack“架构设计”
  3. PKI/CA (2)核心说明
  4. Bitcoin 中的挖矿算法(2) 难度值说明
  5. MIMIC 以太坊医疗项目开发(6)Web3智能合约API
  6. 深度探索C++ 对象模型(1)-三种对象模型的设计
  7. 现代密码学1.2--Kerckhoffs原则
  8. TCP/IP协议簇简介
  9. C/C++ 类库开发库参考【资料整理】
  10. VirtualKD + VMWare双机调试(失败)