题目描述:
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
题目分析:用一个栈来维护括号下标,始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」,遇到左括号入栈,遇到右括号则弹出栈顶元素与之匹配,如果栈为空,则需要更新栈底元素,不为空就相当于进行了一次匹配并更新ans。
代码:
class Solution {
public int longestValidParentheses(String s) {
Stack<Integer> st = new Stack<>();
st.push(-1);
int ans = 0;
//始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i)=='(') {
st.push(i);
}else if(s.charAt(i)==')'){
st.pop();
if(st.isEmpty()) st.push(i);
else{
ans = Math.max(ans,i - st.peek());
}
}
}
return ans;
}
}