【LeetCode】32. Longest Valid Parentheses
Difficulty: Hard
More:【目录】LeetCode Java实现
Description
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"()()"
Intuition
Method 1: Dynamic Programming
1. Define subLen[i] as the length of the longest valid parentheses subString which is end with char at index i (s[i]).
2. If s[i]=='(', subLen[i]=0
If s[i]=='('
If(s[i-subLen[i]-1)==')', subLen[i]=0
If(s[i-subLen[i]-1)=='(', subLen[i]=subLen[i-1]+2+subLen[i-subLen[i-1]-2]
Method 2: Using a stack to store the index of '(', and using 2 pointers to store left index and right index of a subString.
Solution
Method 1
public int longestValidParentheses(String s) { if(s==null || s.length()<=0) return 0; int[] subLen = new int[s.length()]; int maxLen=0; for(int i=1; i<s.length(); i++){ if(s.charAt(i)==')'){ int pre = i-subLen[i-1]-1; if(pre>=0 && s.charAt(pre)=='('){ subLen[i]=subLen[i-1]+2+(pre>0 ? subLen[pre-1] : 0); } maxLen=Math.max(maxLen,subLen[i]); } } return maxLen; }
Method 2
public int longestValidParentheses(String s) { if(s==null || s.length()<=0) return 0; int maxLen=0; int left=-1; Stack<Integer> stk = new Stack<Integer>(); for(int i=0; i<s.length(); i++){ if(s.charAt(i)=='(') stk.push(i); else{ if(stk.isEmpty()) left=i; else{ stk.pop(); int len = stk.isEmpty() ? i-left : i-stk.peek(); maxLen=Math.max(len,maxLen); } } } return maxLen; }
Complexity
Time complexity : O(n)
Space complexity : O(n)
More:【目录】LeetCode Java实现
原文地址:https://www.cnblogs.com/yongh/p/11605247.html
- Google宣布TensorFlow Lite 可支持 Core ML!
- 开源软件十位贡献者,PHP之父只能排第十,第一名当之无愧!
- DataTable排序结果的纠正
- web框架
- java:利用xpath删除xml中的空节点
- java array to list
- Python之Dijango的“坑” hostname, aliases, ipaddrs = gethostbyaddr(name) UnicodeDecodeError: 'utf-8' cod
- nGrinder 简易使用教程
- UI设计高效学习网站&工具,来自学长的收藏夹哦
- 安装git出现templates not found的问题
- 时间戳 时间
- jenkins 设置 gitlab web hooks
- 测试流程?项目管理流程?
- 学web前端开发写给新手的建议,超实用!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux基础学习之文件查找find的常见用法
- Linux基础之xargs命令的入门实例
- CentOS 7.4下安装Oracle 11.2.0.4数据库的方法
- CentOS桌面环境中网卡启动失败的解决方法
- 浅谈Linux vfork与fork简单对比分析
- Linux定时任务Crontab的使用方法
- linux虚拟网络设备之vlan配置详解
- Centos7安装完后无法联网的解决方法
- Linux静态链接库与模板类的处理方式
- 深入研究RocketMQ消费者是如何获取消息的
- CentOS7下 Apache的安装配置方法
- expect命令在linux下实现批量ssh免密
- 学习Vim合并行的方法和技巧
- 九种查找算法
- 代码防御性编程的十条技巧