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