LeetCode Longest Valid Parentheses

原题链接在这里: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.

For "(()", the longest valid parentheses substring is "()", which has length = 2.

Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

题解:

Largest Rectangle in Histogram都是往栈内存index. 

这道题是求最长的括号序列,比较容易想到用栈这个数据结构。基本思路就是维护一个栈,遇到左括号就进栈,遇到右括号则出栈,并且判断当前合法序列是否为最 长序列。不过这道题看似思路简单,但是有许多比较刁钻的测试集。具体来说,主要问题就是遇到右括号时如何判断当前的合法序列的长度。比较健壮的方式如下:
(1) 如果当前栈为空,则说明加上当前右括号没有合法序列(有也是之前判断过的);
(2) 否则弹出栈顶元素,如果弹出后栈为空,则说明当前括号匹配,我们会维护一个合法开始的起点start, 合法序列的长度即为当前元素的位置 i-start+1; 否则如果栈内仍有元素,那肯定是"(". 合法序列就会从这个"("下一位开始. 长度为当前栈顶元素的位置的下一位到当前元素的距离. i-(stk.peek()+1)+1. 因为栈顶元素后面的括号对肯定是合法的, 而 且左括号出过栈了。

Time Complexity: O(n). Space: O(n).

AC Java:

 1 public class Solution {
 2     public int longestValidParentheses(String s) {
 3         if(s == null || s.length() == 0){
 4             return 0;
 5         }
 6         
 7         int res = 0;
 8         int start = 0;
 9         
10         Stack<Integer> stk = new Stack<Integer>();
11         for(int i = 0; i<s.length(); i++){
12             if(s.charAt(i) == '('){
13                 stk.push(i);
14             }else{
15                 //遇到')',但是stack是空的,说明不合法,更新 start 到 i+1
16                 if(stk.isEmpty()){
17                     start = i+1;
18                 }else{
19                     //否则弹出栈顶
20                     stk.pop();
21                     //剩下的stack为空,说明到start 到 i是合法括号对
22                     if(stk.isEmpty()){
23                         res = Math.max(res, i-start+1);
24                     }else{
25                     //身下的stack不为空,说明当前stack的栈顶 后面的括号对才是合法的
26                         res = Math.max(res, i-stk.peek());
27                     }
28                 }
29             }
30         }
31         return res;
32     }
33 }

可以利用DP. 求最长的valid parentheses. 需要储存的历史信息是到当前位最长valid parentheses 长度.

状态转移, 若当前是")". 看当前括号的前一个括号的匹配情况,例如在7之前以6结尾的的最佳匹配是3-6, 看3之前的括号和7是否匹配,不匹配则没有变化; 而6之前以5结尾的最佳匹配是4-5, 此时3和6匹配, 则dp[i]+2.

此外,如果与当前括号匹配的左括号之前的括号的dp值也应该加进来,因为由于添加了当前的括号,那些括号也被连接起来了。例如3和6匹配后, 1和2也应该被加到以6结尾的最佳匹配中.

)  (  )  (  (  )  )  )

0 1 2 3 4 5 6 7

Time Complexity: O(s.length()).

Space: O(s.length()).

AC Java:

class Solution {public int longestValidParentheses(String s) {if(s == null || s.length() == 0){return 0;}int res = 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>=0 ? 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>=0 ? dp[i-dp[i-1]-2] : 0) + 2;}}res = Math.max(res, dp[i]);}return res;}
}

 也可以节省空间. 

分别计数遇到的"(" 和")"的个数l 和 r. 先从左向右扫, l == r时跟新维护res. 当r大于l 时不合法重置为0.

在反过来从右向左扫一次.

为什么不能一次呢. e.g. ()((). 中间出现不合法, 若最后及时r比l小, 但取出r*2. 答案就是4. 正解应该是2.

Time Complexity: O(s.length()). Space: O(1).

AC Java:

 1 class Solution {
 2     public int longestValidParentheses(String s) {
 3         if(s == null || s.length() == 0){
 4             return 0;
 5         }
 6         
 7         int res = 0;
 8         int l = 0;
 9         int r = 0;
10         for(int i = 0; i<s.length(); i++){
11             if(s.charAt(i) == '('){
12                 l++;
13             }else{
14                 r++;
15             }
16             
17             if(l == r){
18                 res = Math.max(res, r*2);
19             }else if(r > l){
20                 l = 0;
21                 r = 0;
22             }
23         }
24         
25         l = 0; 
26         r = 0;
27         for(int i = s.length()-1; i>=0; i--){
28             if(s.charAt(i) == '('){
29                 l++;
30             }else{
31                 r++;
32             }
33             
34             if(l == r){
35                 res = Math.max(res, r*2);
36             }else if(l > r){
37                 l = 0;
38                 r = 0;
39             }
40         }
41         return res;
42     }
43 }

 

转载于:https://www.cnblogs.com/Dylan-Java-NYC/p/4824941.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PC和服务器的IP地址信息DNS,PC和服务器的IP地址信息DNS

PC和服务器的IP地址信息DNS 内容精选换一换网站的访问与云服务器的网络配置、端口通信、防火墙配置、安全组配置等多个环节相关联。任意一个环节出现问题&#xff0c;都会导致网站无法访问。本节操作介绍网站无法访问时的排查思路。网站无法访问怎么办&#xff1f;如果打开网站…

abaqus生成adams柔性体_专栏 | HyperMesh_To_Abaqus接口——模型导入导出问题

作者介绍TechmanLXS硕士十余年工程经验擅长Hypermesh建模&#xff0c;Hyperworks全平台分析软件&#xff0c;abaqus软件。整车级被动安全(ls-dyna、Radioss)&#xff0c;零部件级(moldflow模流分析&#xff0c;塑料件联合仿真分析)。熟知汽车车身&#xff0c;内外饰&#xff0c…

knockoutJS学习笔记01:从拼接字符串到编写模板引擎

开篇 关于knockout的文章&#xff0c;园里已经有很多大神写过了&#xff0c;而且都写得很好。其实knockout学习起来还是很容易的&#xff0c;看看官网的demo和园里的文章&#xff0c;练习练习就可以上手了&#xff08;仅限使用&#xff0c;不包含研究源码&#xff09;。之所以想…

新乡台达服务器驱动器维修,台达DELTA伺服驱动器维修

与数控装置的接口电路无关。检查测量系统电缆连接正确、可靠&#xff0c;排除了电缆连接的问题。利用示波器检查位置测量系统的前置放大器EXE601/5-F的Ual和Ua*Ua1和Ua2输出波形&#xff0c;发现Ua1相无输出。进一步检查光栅输出(前置放大器EXE601/5-F的输入)信号波形&#xff…

60度斜坡怎么计算_【测绘】南方CASS土方计算方法—方格网法

01概述在我们的日常工作中&#xff0c;遇到大量的土方修正算的相关咨询&#xff0c;为什么CASS的方格网土方修正算&#xff0c;方格设定为10米和20米&#xff0c;修正算结果有很大差异呢&#xff1f;从软件计算原理、数据质量等方面进行分析&#xff0c;读了这篇文章&#xff0…

NSMutableArray 排序

NSMutableArray *array1[NSMutableArray arrayWithObjects:"1","3","2", nil];//NSLog("%",array1);/*结果:(1,3,2 )*/NSLog("%",array1);NSArray *array2 [array1 sortedArrayUsingSelector:selector(compare:)];//注意 这…

综合时如何插入scan_三综合环境试验箱维修时如何做出正确判断?

三综合环境试验箱维修时如何做出正确判断?三综合环境试验箱在试验的过程中&#xff0c;可以根据需要设定不同的温度情况&#xff0c;以便于为各种测试要求提供便利的条件。在测试一些材料结构或复合材料的时候&#xff0c;主要是利用其在瞬间高温情况或者是在极低温的连续环境…

mysql 判断字段为null表示 false 其它为true_日拱一卒,MySQL数据库 常用SQL优化技巧 十一式...

本文中所提到的SQL优化技巧均是基于Mysql 索引 BTree类型 。将从以下几个方面介绍常用的SQL优化技巧&#xff1a;避免在 WHERE 子句中使用 ! 或 <> 操作符。避免在 WHERE 子句中对索引列使用 %前缀模糊查询。避免在 WHERE 子句中对索引列使用 OR 来连接条件。避免在 WHER…

b样条和三次样条_样条曲线

最近在学习轨迹规划中的轨迹生成&#xff0c;涉及到样条曲线方面的知识&#xff0c;总结一下。二次样条三次样条曲线平滑曲线的平滑性和相应的平滑性的评判准则相关&#xff0c;在[1]中&#xff0c;作者采用曲率的平方和曲率导数的平方作为评判准则其中 是路径点的方向角。最小…

数字图像处理

题目&#xff1a;大规模图像中的目标检测与分类方法 在进行图像目标识别与跟踪时&#xff0c;摄像机所采集的图像&#xff0c;在成像、数字化以及传输过程中&#xff0c;难免会受到各种各样噪声的干扰&#xff0c;图像的质量往往会出现不尽人意的退化&#xff0c;影响了图像的视…

2015年秋季个人阅读计划

10月阅读计划&#xff1a;《软件需求模式》 10月12日23:59前发表第一篇读书笔记。 10月22日23:59前发表第二篇读书笔记。 10月31日23:59前发表第三篇读书笔记。 11月阅读计划&#xff1a;需求模式——软件建模与分析 11月12日23:59前发表第一篇读书笔记。 11月22日23:59前发表第…

内容可编辑_让PDF像WORD一样自由编辑,好用的PDF编辑工具推荐

在日常工作中&#xff0c;我们经常要和PDF文件打交道。以往编辑PDF文件&#xff0c;比如修改文字等&#xff0c;需要下载专门的PDF编辑软件&#xff0c;通常编辑器都会超过200M&#xff0c;下载安装很麻烦&#xff0c;还会挤压电脑的储存空间&#xff0c;影响运行速度。当迅读P…

DHL 快递跟踪查询

思路描述&#xff1a;主要使用正则表达式解析。 返回一个跟踪步骤列表。 public class TrackingData { public string time { get; set; } public string context { get; set; } } public class DHLExpressTrackingHelper { private static string urlFormat "http://web…

会返回两次_嫦娥五号为何用独特的半弹道式返回方式?原来有更深远的考虑……...

更多战史及装备评说&#xff0c;请移步公众号asiavikin&#xff08;转载请注明出处&#xff09;24日凌晨4时30分&#xff0c;嫦娥五号在文昌航天发射场由长征五号火箭成功送入地月转移轨道&#xff0c;22时6分完成第一次轨道修正&#xff0c;可喜可贺。这是人类44年来首度去月球…

【转】VS2013中如何解决error C4996: 'fopen'问题

原文网址&#xff1a;http://jingyan.baidu.com/article/ce436649fd61543773afd32e.html 今天编写控制台应用程序时出现如下错误 error C4996: fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_…

中关键字 表示空类型_C语言数据类型

程序在运行时要做的内容就是处理数据。程序要解决复杂的问题&#xff0c;就要处理不同的数据。不同的数据都是以自己本身的一种特定形式存在的&#xff0c;不同的数据类型占用不同的存储空间。C语言中有多种不同的数据类型&#xff0c;其中包括几个大的方向&#xff1a;基本数据…

理解inode

。 理解inode 一、inode是什么&#xff1f; 理解inode&#xff0c;要从文件储存说起。 文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做"扇区"&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&#xff09;。 操作系统读取硬盘的时…

帧同步_微信小游戏接入“熊孩子噩梦”健康系统 帧同步能力上线

3月31日&#xff0c;微信小游戏官方公众号“做个小游戏”发文宣布全新面向未成年人保护的健康系统已经上线&#xff0c;该系统联动“成长守护平台”的功能&#xff0c;可以更好助力家长群体对于未成年人游戏行为的监管。另外就在昨天&#xff0c;微信小游戏也曝光了另外一项新能…

【js】获得项目路径

1 var curWwwPathwindow.document.location.href; 2 //获取主机地址之后的目录&#xff0c;如&#xff1a; uimcardprj/share/meun.jsp 3 var pathNamewindow.document.location.pathname; 4 var poscurWwwPath.indexOf(pathName); //获取主机地址&#xff0c;如&…

写一个python程序、求解使得npv值为零的折现率_计算题专题:净现值NPV分析与习题...

净现值(NPV)是反映投资方案在计算期内获利能力的动态评价指标。投资方案的净现值是指用一个预定的基准收益率(或设定的折现率)i&#xff0c;分别把整个计算期间内各年所发生的净现金流量都折现到投资方案开始实施时的现值之和。今天的一分钱要比明天的一分钱值钱NPV—计算公式和…