32. Longest Valid Parentheses

32. 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.

 

这个问题主要考虑2中情况

第一种:())()()

第二种:()(()() 

两种答案都是4

第一种比较简单,我们用一个堆栈维护,堆栈只保存"("的情况,发现是")",就弹出。如果发现堆栈为空了,表示起点要重新更新了。

第二种就比较难想到,我们会发现到最后的时候,堆栈里还是存在一个"(",没法去匹配了,也就是堆栈不为空。那4是怎么得出来的?

想象一下如果stack里存的不是"(",而是对应的下标值,那最后一个")"的时,假设变量 i 为 6(i从0开始),stack里存的之前的那个单独的")"

的下标为2.  6-2正好为4。

 

 1 /**
 2  * @param {string} s
 3  * @return {number}
 4  */
 5 var longestValidParentheses = function(s) {
 6     
 7    //这题没想出来,看了一篇别人写的结题报告,挺好的。
 8     //http://blog.csdn.net/worldwindjp/article/details/39460161
 9     
10     var start = -1;
11     var stack = [];
12     var max = 0;
13     for(var i = 0;i<s.length;i++){
14         
15         if(s.charAt(i) == "("){
16             
17             stack.push(i);
18         }else{
19             
20             if(stack.length){
21                 
22                 stack.pop();
23                 if(!stack.length){
24                     
25                     max = Math.max(i-start,max);    
26                 }else{
27                     
28                     max =  Math.max(i-stack[stack.length - 1],max);    
29                 }
30             }else{
31                 
32                 start = i;
33             }
34             
35             
36         }
37         
38     }
39     
40     return max;
41 };

 

posted @ 2017-10-21 11:35  hdu胡恩超  阅读(161)  评论(0编辑  收藏  举报