Given a string containing just the characters '('
and ')'
, find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
Example 2:
Input: ")()())
" Output: 4 Explanation: The longest valid parentheses substring is"()()"
解决方案如下:
public int longestValidParentheses(String s) {
char[] c = s.toCharArray();
Stack<Integer> stack = new Stack<>();
int count = 0;
int l = 0;
for(int i = 0; i < c.length; i++) {
if(c[i] == '('){
stack.push(i);
} else {
// 说明已经非法了, 需要重新开始
if(stack.isEmpty()) {
l = i + 1;
} else {
stack.pop();
if(stack.isEmpty()) {
//这里是正常情况也就是有效情况下的长度
count = Math.max(i - l + 1, count);
} else {
/*
这里的话其实做了一个逻辑处理,stack.peek()是指上一次非法的(入栈的索引,比如(()(),
考虑这个情况合法的索引是1 ~ 4, 但是根据代码逻辑 索引1早就出栈了 ,只有索引0会存在栈中, 但是
合法长度是 4 - 1 + 1. 所以实际上用 4 - 0效果是一样的。 只有(() 这样的情况代码逻辑才会走到这里来
.*/
count = Math.max(count,i - stack.peek());
}
}
}
}
return count;
}