LeetCode 32. Longest Valid Parentheses(最长有效括号)

来源:互联网 发布:中文msds数据库 编辑:程序博客网 时间:2024/05/20 04:14

原题网址: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.

方法:用from来表示当前有效的开始点,即一旦出现根本无法匹配的情况,from将向前推进。用栈来保存左括号的坐标,每配对成功一个就出栈一个。

public class Solution {    public int longestValidParentheses(String s) {        int[] stack = new int[s.length()];        int size = 0;        int max = 0;        int from = 0;        for(int i=0; i<s.length(); i++) {            if ('(' == s.charAt(i)) stack[size++] = i;            else if (size==0) from = i+1;            else {                int p = stack[--size];                if (size==0) {                    max = Math.max(max, i-from+1);                } else {                    max = Math.max(max, i-stack[size-1]);                }            }        }        return max;    }}

另一种实现:

public class Solution {    public int longestValidParentheses(String s) {        char[] sa = s.toCharArray();        int[] pos = new int[sa.length+1];        int max = 0;        int size = 0;        pos[size++] = -1;        for(int i=0; i<sa.length; i++) {            if (sa[i] == '(') {                pos[size++] = i;            } else if (size > 1) {                size --;                max = Math.max(max, i-pos[size-1]);            } else {                pos[0] = i;            }        }        return max;    }}

另一种实现:

public class Solution {    public int longestValidParentheses(String s) {        char[] sa = s.toCharArray();        int[] stack = new int[sa.length];        int size = 0;        int from = 0;        int max = 0;        for(int i = 0; i < sa.length; i++) {            if (sa[i] == '(') {                stack[size++] = i;            } else if (size == 0) {                from = i + 1;            } else if (size == 1) {                max = Math.max(max, i - from + 1);                size--;            } else {                size--;                max = Math.max(max, i - stack[size - 1]);            }        }        return max;    }}

0 0
原创粉丝点击