最长有效括号
时间:2022-07-22
本文章向大家介绍最长有效括号,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题描述:
给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
大体思路:
定义dp[i] 为以 i 结尾的最长有效括号长度。
转移函数如下:
为了简化逻辑,上述公式并未考虑溢出的情况。
第一种情况当前结点为左括号,以其结尾无论如何也构不成有效括号,值为0;
第二种情况,形如“(())()”的当前结点为最后一个元素的情况,当前结点为右括号,前一个为左括号,其正好能组成一对,因此等于i - 2结尾的长度加2;
第三种情况形如“()(()())”的当前结点为最后一个元素的情况,当前结点为右括号,其前一个结点也为右括号,s[i - dp[i - 1] - 1]为以s[i - 1]结尾的最长有效括号的前一个元素,该元素为左括号时就可以和s[i]的右括号组成一对,因此结果为dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]。
第四种情况形如“)()())”的当前结点为最后一个元素的情况,s[i - dp[i - 1] - 1]不能和s[i]组成一对,因此以当前结点结尾的最长有效长度为0。
实现代码如下:
class Solution {
public int longestValidParentheses(String s) {
int N = s.length();
int[] dp = new int[N];
int max = 0;
for(int i = 1; i < N; i++){
if(s.charAt(i) == '('){
continue;
}
if(s.charAt(i - 1) == '('){
dp[i] = i - 2 < 0 ? 2 : 2 + dp[i - 2];
}else if(i - dp[i - 1] - 1 >= 0 && s.charAt(i - dp[i - 1] - 1) == '('){
dp[i] = dp[i - 1] + 2;
dp[i] += i - dp[i - 1] - 2 < 0 ? 0 : dp[i - dp[i - 1] - 2];
}
max = Math.max(max, dp[i]);
}
return max;
}
}
- win7 64位下如何折腾Tubro C 3.0
- TweenLite的又一应用:图片的拼图加载效果
- mysql创建数据表时如何判断是否已经存在?
- 温故知新:接口的隐式实现与显式实现
- 也谈枚举ToString()性能的改进
- silverlight:利用telerik中的zip类对字符串进行压缩、解压
- 索引,视图,存储过程和触发器文档
- 重点解读:用小程序给公众号涨粉10w的7大行业案例
- 网络域名与注册商标冲突的解决途径
- 网站代码优化我们必须要做的那些事
- 真是热闹! Slade.com等多个域名被曝交易
- python编码问题之"encode"&"decode"
- python3编码问题终结者--还搞不懂你来找我
- Pycharm集成PyQt4并使用
- 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 数组属性和方法