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 };