Q:给出一个仅包含字符'('和')'的字符串,计算最长的格式正确的括号子串的长度。对于字符串"(()"来说,最长的格式正确的子串是"()",长度为2.再举一个例子:对于字符串")()())",来说,最长的格式正确的子串是"()()",长度为4.
A:所有错误的位置取出来,然后算中间正确的长度。
public static int longestValidParentheses(String s) {
if (s.length() == 0)
return 0;
char[] c = s.toCharArray();
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < c.length; i++) {
if (c[i] == '(') {
stack.push(i);
} else {
if (stack.empty()) {
stack.push(i);
} else {
if (c[stack.peek()] == '(') {
stack.pop();
} else {
stack.push(i);
}
}
}
}
//为了减少判断,在前面和后面放一个头一个尾
int[] arr = new int[stack.size() + 2];
arr[0] = -1;
arr[arr.length - 1] = c.length;
for (int i = arr.length - 2; i > 0; i--) {
arr[i] = stack.pop();
}
int max = 0;
for (int i = 1; i < arr.length; i++) {
max = Math.max(max, arr[i] - arr[i - 1] - 1);
}
return max;
}