032 最长有效括号
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
方法:栈
思路:其实看到括号匹配这种就应该想到用栈来,这题最难的地方就是理解什么叫有效括号,一个括号当然叫有效括号,但一旦隔开了就要分别算,取最大的。
(1)需有一个变量start记录有效括号子串的起始下标,max表示最长有效括号子串长度,初始值均为0
(2)遍历给字符串中的所有字符
1若当前字符s[index]为左括号’(’,将当前字符下标index入栈(下标稍后有其他用处),处理下一字符
2若当前字符s[index]为右括号’)’,判断当前栈是否为空
1若栈为空,则start = index + 1,处理下一字符(当前字符右括号下标不入栈)
2若栈不为空,则出栈(由于仅左括号入栈,则出栈元素对应的字符一定为左括号,可与当前字符右括号配对),判断栈是否为空
1若栈为空,则max = max(max, index-start+1)
2若栈不为空,则max = max(max, index-栈顶元素值)
代码:
public int longestValidParentheses(String s) {
int max = 0, start = 0;
if(null == s) return 0;
int len = s.length();
Stack<Integer> stack = new Stack<>();
for(int index = 0; index < len; index++){
//遇左括号(,压栈(栈中元素为当前位置所处的下标)
if('(' == s.charAt(index)){
stack.push(index);
continue;
} else {
if(stack.isEmpty()){
start = index+1;
continue;
} else {
stack.pop();
if(stack.isEmpty()){
max = Math.max(max, index-start+1);
} else {
max = Math.max(max, index-stack.peek());
}
}
}
}
return max;
}
注意:如果不懂的话就多找几个错误例子来对着代码进行理解,读懂什么叫有效括号