说明

算法:Longest Valid Parentheses
LeetCode地址:https://leetcode.com/problems/longest-valid-parentheses/

题目:
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 "()()"

解题思路1

题意是判断括号匹配是否正确,很明显,我们可以用栈来解决这个问题,用Stack存储开始匹配的上一个位置,那么当前的位置减去上个位置,就是最长的匹配。
注意:初始位置需要设置为-1.
时间复杂度为 O(N), 空间复杂度为O(N)。

代码实现1

import java.util.Stack;public class LongestValidParentheses {/*** 用Stack存储开始匹配的上一个位置,那么当前的位置减去上个位置,就是最长的匹配,* 时间复杂度为O(n), 空间复杂度为O(n)* @param s* @return*/public int longestValidParentheses(String s) {int len = s.length();Stack<Integer> stack = new Stack<>();stack.push(-1);int maxLen = 0;for (int i = 0; i < len; i++) {if (s.charAt(i) == '(') {stack.push(i);} else {stack.pop();if (stack.isEmpty()) {stack.push(i);} else {maxLen = Math.max(maxLen, i - stack.peek());}}}return maxLen;}public static void main(String[] args) {String input = "((())";LongestValidParentheses obj = new LongestValidParentheses();System.out.println("input: ((()), Output -> " + obj.longestValidParentheses(input));}
}

运行结果

input: ((()), Output -> 4

代码执行效率1

Runtime: 11 ms, faster than 76.09% of Java online submissions for Longest Valid Parentheses.
Memory Usage: 38.7 MB, less than 17.46% of Java online submissions for Longest Valid Parentheses.

解题思路2

如果不需要Stack,那么空间复杂度就会大大降低。实际上只要找出成对的括号。从左到右,又从右到左,两个方向找最长的匹配。这里的技巧就是,如果从左边开始查找,合规情况那么左括号 '(' 肯定先发现,如果右括号大于左括号那么就退出。如果从右边开始查找,合规情况那么右括号 ')' 肯定先发现,所以左括号大于右括号就退出。
时间复杂度为 O(N), 空间复杂度为O(1)。

代码实现2

public class LongestValidParentheses {/*** 从左到右,又从右到左,两个方向找最长的匹配。* 时间复杂度为O(n), 空间复杂度为O(1)* @param s* @return*/public int longestValidParenthesesWithoutStack(String s) {int left = 0;int right = 0;int maxLen = 0;int len = s.length();for (char c: s.toCharArray()) {if (c == '(') {left++;} else {right++;}if (left == right) {maxLen = Math.max(maxLen, right * 2);} else if (right > left) {left = right = 0;}}left = right = 0;for (int i = len - 1; i >= 0; i--) {if (s.charAt(i) == '(') {left++;} else {right++;}if (left == right) {maxLen = Math.max(maxLen, left * 2);} else if (left > right) {left = right = 0;}}return maxLen;}public static void main(String[] args) {String input = "((())";LongestValidParentheses obj = new LongestValidParentheses();System.out.println("input: ((()), Output -> " + obj.longestValidParenthesesWithoutStack(input));}
}

运行结果2

input: ((()), Output -> 4

代码执行效率2

Runtime: 6 ms, faster than 100.00% of Java online submissions for Longest Valid Parentheses.
Memory Usage: 38.2 MB, less than 20.76% of Java online submissions for Longest Valid Parentheses.

总结

  1. 考查栈的运用,小心栈越界问题。
  2. 善用两个方向,降低空间复杂度。

代码下载:
https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/popular/LongestValidParentheses.java

算法:Longest Valid Parentheses(最长有效的括号)相关推荐

  1. 32. Longest Valid Parentheses 最长有效括号

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

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

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

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

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

  4. Longest Valid Parentheses leetcode java

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

  5. LeetCode Longest Valid Parentheses

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

  6. LeetCode 32. Longest Valid Parentheses

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

  7. LeetCode算法入门- Valid Parentheses -day11

    LeetCode算法入门- Valid Parentheses -day11 题目描述: Given a string containing just the characters '(', ')', ...

  8. Leetcode: Longest Valid Parentheses

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

  9. 【Python】最长括号匹配问题:给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串

    最长括号匹配 示例: 给定字符串,仅包含左括号'('和右括号')',它可能不是括号匹配的,设计算法,找出最长匹配的括号子串. 算法分析 只有在右括号和左括号发生匹配时,才有可能更新最终解. 计算s[0 ...

  10. 32. Longest Valid Parentheses

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

最新文章

  1. docker端口映射或启动容器时报错 driver failed programming external connectivity on endpoint quirky_allen
  2. python格式化字符串漏洞_Python新型字符串格式漏洞分析及解决方案
  3. 使用回溯算法分析八皇后问题
  4. python学习并发编程
  5. bootstrap 悬浮固定_CST Tech Tips - 流式细胞术中如何固定和通透细胞?
  6. MySQL回闪_MySQL进行BINLOG回闪
  7. finereport字段显示设置_QA | 表单如何设置字段显示逻辑?
  8. 认识Linux系统中的inode,硬链接和软链接
  9. 【动态规划】开心的小明
  10. python基本网络爬虫代码_python 网络爬虫初级实现代码
  11. ccfcsp化学方程式java_化学方程式-ccf
  12. 6年java工作经验总结
  13. HTML5七夕情人节表白网页(蓝色背景3D相册) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心
  14. Reverse Polish notation(逆波兰式)
  15. 基于rk3288的驱动编译
  16. c语言 编译开关用法,C语言中define的使用方法
  17. idea突然很卡解决办法
  18. Oh-My-Zsh安装与配置
  19. vue过滤器的定义及使用
  20. 直击|为防虚假信息 百合佳缘引入第三方征信查询合作

热门文章

  1. java架构师_阿里P8架构师分享:想成为Java架构师,必须掌握的几点技术
  2. java p39课后答案_面向对象程序设计(JAVA)答案
  3. Visual Studio 2008操作技巧
  4. 利用jira-python及selenium完成jira的统计报表及日报的填写
  5. JAVA调用shell脚本利用ansible修改多节点上的redis参数
  6. 使用Jest对原生TypeScript项目进行UI测试
  7. 在Winform开发框架中实现对数据库的加密支持
  8. JavaScript_高程三_01
  9. mac 下 word 2011 使用笔记
  10. 使用php glob函数查找文件,遍历文件目录(转)