leetcode 32. Longest Valid Parentheses __ java

来源:互联网 发布:淘宝推广赚佣金 编辑:程序博客网 时间:2024/05/17 23:00

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.
举例
网上看到了栈法,记录一下我的理解;
( ( ) ( ) ) ( ) ) ( ) ( ) ( ) ( )
0 9
比较直观地看一下 0-7这 8个是合法的 到8这个)的出现 导致不合法 断掉了 所以0开始的最大长度是8 而且不需要考虑这中间 其他的(开始的了 比如第1位 第3位 第6位这几个左括号 因为它们肯定也会走到这里断掉 还没有0开始的长
断掉以后 碰到)就直接忽略 碰到(就从头再来 所以在第9位从来 再来 一直没有断掉直到结尾
就是等于把整个字符串分成了两段 而且每一段不用记录具体是什么 只需要记录每一段的长度即可 所以可以覆盖 用一个栈里即可
栈底应该存放这一段开始的起始位置 碰到(就将该(的位置入栈 碰到右括号就将上一个(出栈 并且拿当前长度即该位置和上一个左括号的位置之差 去跟最大长度比一下
如果当前栈空了 却碰到了) 说明已经非法了 这一段已经到达了合法的极限位置 要将栈底的原起始位置pop掉 将该位置 作为新的一段的起始点
举例:

(   (   )   )   )   ) ( )|-1 0                  当前 (   |-1 0  1               当前(|-1 0                  当前) 长度为2|-1                    当前) 长度为4|4                     当前) 栈底已空 说明这时进来的)非法                        所以开始另一段 将当前的位置4作为新一段的                          起始位置 |5                     当前) 栈底已空 说明这时进来的)非法                        所以开始另一段 将当前的位置5作为新一段的                          起始位置|5 6                   当前(|5                     当前) 长度为2

总结:
首先栈里进的都是左括号的位置 每次碰到右括号 去栈里取出上一个左括号(即和它匹配的左括号)的位置 二者之差为总长度 可记录一下
如果已经空栈了却还进入了右括号 就非法了 说明开启了新的一段 重新入出栈即可
“记录一下”不用全记录下来 记录出现过的最大值即可

public int longestValidParentheses(String s) {        int result = 0;        Stack<Integer> stack = new Stack<Integer>();        stack.push(-1);        for(int i = 0;i < s.length();i++){            if(s.charAt(i) == '('){                stack.push(i);            }            else{// s.charAt(i) == ')'                if(stack.size() == 1){//非法                    stack.pop();                    stack.push(i);                }                else{                    stack.pop();                    int temp = i - stack.peek();                    if(temp > result){ result = temp;}                }            }        }        return result;    }

用add会超 用push不会 不明觉历!!!!!
看看区别!!!!!!

0 0
原创粉丝点击