Leetcode 32 最长有序括号
题目描述
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
解题思路
对于后进先出的情况,利用栈。stack.peek()(栈顶)一直保存着有效括号开始的下标
遍历字符串,
如果是左括号,或者是右括号但栈顶没有与之匹配的左括号,则入栈。
如果为右括号,且栈顶有左括号与之匹配,则左括号出栈,出栈后:
如果栈是空的,说明前面的序列一直是有效的,max = i + 1;如果栈不为空,则这段有效括号的长度为:i - stack.peek()。stack.peek()一直保存着有效括号开始的下标
代码
public int longestValidParentheses(String s) {
Stack<Integer> stack = new Stack<Integer>();
char[] c = s.toCharArray();
int max = 0;
for(int i = 0; i < c.length; i++) {
//如果为右括号,且栈顶有左括号与之匹配
if(c[i] == ')' && ! stack.isEmpty() && c[stack.peek()] == '(') {
stack.pop();//左括号出栈
//如果栈是空的,说明前面的序列一直是有效的
if(stack.isEmpty()) {
max = i + 1;
} else if(max < i - stack.peek()){
//左括号出栈后,如果栈不为空,则这段有效括号的长度为:i - stack.peek(),
//因为左括号出栈了,所以peek()代表的下标减1了,所以才会让有效括号的长度==i - stack.peek()
//即左括号出栈后,peek()代表有效数组开始的下标-1
max = i - stack.peek();
}
}
else { //如果不是右括号,或者没有与之匹配的左括号,则入栈
stack.push(i);
}
}
return max;
}