[Leetcode][第32题][JAVA][最长有效括号][动态规划][栈][正向逆向结合]
【问题描述】[困难]
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。示例 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][最长有效括号][动态规划][栈][正向逆向结合]相关推荐
- [Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]
[问题描述][中等] 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度.示例 1:输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度 ...
- [Leetcode][第1143题][JAVA][最长公共子序列][LCS][动态规划]
[问题描述][中等] [解答思路] 时间复杂度:O(N^2) 空间复杂度:O(N^2) class Solution {public int longestCommonSubsequence(Stri ...
- [Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]
[问题描述][中等] [解答思路] 1. 动态规划 第 1 步:设计状态 令 f[i][j] 表示将数组的前 i 个数分割为 j 段所能得到的最大连续子数组和的最小值. ( i ≥ j ) 第 2 步 ...
- [Leetcode][第546题][JAVA][移除盒子][递归][动态规划]
[问题描述][困难] [解答思路] 1. 递归 动态规划 class Solution {public int removeBoxes(int[] boxes) {int[][][] dp = new ...
- [Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]
[问题描述][中等] [解答思路] 1. 动态规划思路一 自上而下 第 1 步:设计状态 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和 位置(i,j) 指的是三角形中第 i 行第 ...
- [剑指offer]面试题第[63]题[Leetcode][第121题][JAVA][买卖股票的最佳时机][动态规划][暴力]
[问题描述][简单] [解答思路] 1. 暴力 时间复杂度:O(N^2) 空间复杂度:O(1) public class Solution {public int maxProfit(int pric ...
- [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]
[问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...
- [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]
[问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...
- [Leetcode][第78题][JAVA][子集][位运算][回溯]
[问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...
最新文章
- 比特币和以太坊本质有什么区别?
- 家里宽带628连不上_连不上无线网络?到底是路由器还是电脑的“锅”,看完这篇就知道...
- 微信小程序时间转换成时间戳、获取当前时间戳、获取当前时间、时间戳加减
- 1.8(学习笔记)监听器(Listener)
- 一位嵌入式工程师,硬核单片机编程思想!
- 初学者内心最慌的问题:适不适合做一名码农(程序员)??
- HTML5+CSS+JQuery 实现简单的进度条功能
- Linux/Documentations: Kernel Livepatching
- 计算机教师自检自查报告,信息技术教学工作自查报告
- NFS 服务安全加固
- 利用Python网络爬虫抓取微信好友的签名及其可视化展示
- 受宠的背后:安全市场面临重新洗牌
- cve20190708补丁的kb名称_2019-6微软安全更新补丁KB4503269
- js 验证联系方式 手机号码及座机号码
- [R] R语言删除字符串中的空值““
- “竹影扫阶尘不动,月穿潭底水无痕”引出的……
- 【毕业设计】基于卷积神经网络的植物花卉识别系统
- 第一章 基本数据类型-API的理解和使用
- python学后总结_学员 | 斥巨资学完数据分析后,给大家总结了7个小建议
- Visual Studio 2008 官方破解版
热门文章
- iOS之本地推送通知使用介绍
- 【转】Xcode 7 真机调试详细步骤
- GridView控件RowDataBound事件中获取列字段值的几种途径
- bootstrap 一排5个_BootStrap从基础到项目实战_第1季_03章_02_CSS样式栅格系统实例
- MyEclipse创建struts.xml
- Android View生命周期
- 微信小程序登录 更新中
- java solr_通过Java访问Solr服务实例及相关配置
- 动态规划之力扣股票类问题
- Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用