【问题描述】[困难]

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

【解答思路】

1. 动态规划

动态规划流程
第 1 步:设计状态
dp[i] 表示以下标 ii 字符结尾的最长有效括号的长度
第 2 步:状态转移方程
“……()”:s[i]=‘)’ 且 s[i−1]=‘(’ dp[i]=dp[i−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
第 3 步:考虑初始化
注意 边界问题 i>=0
第 4 步:考虑输出
maxans = Math.max(maxans, dp[i]);

时间复杂度:O(N) 空间复杂度:O(N)

public class Solution {public int longestValidParentheses(String s) {int maxans = 0;int dp[] = new int[s.length()];for (int i = 1; i < s.length(); i++) {if (s.charAt(i) == ')') {if (s.charAt(i - 1) == '(') {dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;} else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;}maxans = Math.max(maxans, dp[i]);}}return maxans;}
}
2. 栈

辅助 不符合条件时要中断
遇到“(”把当前遍历i下标入栈
遇到“)”出栈 空时证明子串中断 非空 计算深度 i - stack.peek()

时间复杂度:O(N) 空间复杂度:O(N)

public class Solution {public int longestValidParentheses(String s) {int maxans = 0;Stack<Integer> stack = new Stack<>();stack.push(-1);for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == '(') {stack.push(i);} else {stack.pop();if (stack.empty()) {stack.push(i);} else {maxans = Math.max(maxans, i - stack.peek());}}}return maxans;}
}
3. 正向逆向结合


时间复杂度:O(N) 空间复杂度:O(1)

public class Solution {public int longestValidParentheses(String s) {int left = 0, right = 0, maxlength = 0;for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == '(') {left++;} else {right++;}if (left == right) {maxlength = Math.max(maxlength, 2 * right);} else if (right > left) {left = right = 0;}}left = right = 0;for (int i = s.length() - 1; i >= 0; i--) {if (s.charAt(i) == '(') {left++;} else {right++;}if (left == right) {maxlength = Math.max(maxlength, 2 * left);} else if (left > right) {left = right = 0;}}return maxlength;}
}

【总结】

1.动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

2.栈 计算长度的题目 可以以字符串位置下标入栈 引入辅助栈(长度开始的下标)
3. 正向逆向结合 好方法 好思想 灵活运用

转载链接:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode-solution/

[Leetcode][第32题][JAVA][最长有效括号][动态规划][栈][正向逆向结合]相关推荐

  1. [Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]

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

  2. [Leetcode][第1143题][JAVA][最长公共子序列][LCS][动态规划]

    [问题描述][中等] [解答思路] 时间复杂度:O(N^2) 空间复杂度:O(N^2) class Solution {public int longestCommonSubsequence(Stri ...

  3. [Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]

    [问题描述][中等] [解答思路] 1. 动态规划 第 1 步:设计状态 令 f[i][j] 表示将数组的前 i 个数分割为 j 段所能得到的最大连续子数组和的最小值. ( i ≥ j ) 第 2 步 ...

  4. [Leetcode][第546题][JAVA][移除盒子][递归][动态规划]

    [问题描述][困难] [解答思路] 1. 递归 动态规划 class Solution {public int removeBoxes(int[] boxes) {int[][][] dp = new ...

  5. [Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]

    [问题描述][中等] [解答思路] 1. 动态规划思路一 自上而下 第 1 步:设计状态 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和 位置(i,j) 指的是三角形中第 i 行第 ...

  6. [剑指offer]面试题第[63]题[Leetcode][第121题][JAVA][买卖股票的最佳时机][动态规划][暴力]

    [问题描述][简单] [解答思路] 1. 暴力 时间复杂度:O(N^2) 空间复杂度:O(1) public class Solution {public int maxProfit(int pric ...

  7. [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...

  8. [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...

  9. [Leetcode][第78题][JAVA][子集][位运算][回溯]

    [问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...

最新文章

  1. 比特币和以太坊本质有什么区别?
  2. 家里宽带628连不上_连不上无线网络?到底是路由器还是电脑的“锅”,看完这篇就知道...
  3. 微信小程序时间转换成时间戳、获取当前时间戳、获取当前时间、时间戳加减
  4. 1.8(学习笔记)监听器(Listener)
  5. 一位嵌入式工程师,硬核单片机编程思想!
  6. 初学者内心最慌的问题:适不适合做一名码农(程序员)??
  7. HTML5+CSS+JQuery 实现简单的进度条功能
  8. Linux/Documentations: Kernel Livepatching
  9. 计算机教师自检自查报告,信息技术教学工作自查报告
  10. NFS 服务安全加固
  11. 利用Python网络爬虫抓取微信好友的签名及其可视化展示
  12. 受宠的背后:安全市场面临重新洗牌
  13. cve20190708补丁的kb名称_2019-6微软安全更新补丁KB4503269
  14. js 验证联系方式 手机号码及座机号码
  15. [R] R语言删除字符串中的空值““
  16. “竹影扫阶尘不动,月穿潭底水无痕”引出的……
  17. 【毕业设计】基于卷积神经网络的植物花卉识别系统
  18. 第一章 基本数据类型-API的理解和使用
  19. python学后总结_学员 | 斥巨资学完数据分析后,给大家总结了7个小建议
  20. Visual Studio 2008 官方破解版

热门文章

  1. iOS之本地推送通知使用介绍
  2. 【转】Xcode 7 真机调试详细步骤
  3. GridView控件RowDataBound事件中获取列字段值的几种途径
  4. bootstrap 一排5个_BootStrap从基础到项目实战_第1季_03章_02_CSS样式栅格系统实例
  5. MyEclipse创建struts.xml
  6. Android View生命周期
  7. 微信小程序登录 更新中
  8. java solr_通过Java访问Solr服务实例及相关配置
  9. 动态规划之力扣股票类问题
  10. Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用