给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入: s = "(()"
输出: 2
解释: 最长有效括号子串是 "()"
示例 2:
输入: s = ")()())"
输出: 4
解释: 最长有效括号子串是 "()()"
示例 3:
输入: s = ""
输出: 0
提示:
0 <= s.length <= 3 * 104s[i]为'('或')'
题解:
思路:栈
- 如果遇到左括号 '(',将它的索引压入栈中。
- 如果遇到右括号 ')':
- 首先弹出栈顶元素,表示匹配了一个左括号。
- 如果栈变空了,将当前右括号的索引压入栈中。
- 如果栈不为空,计算当前有效子串的长度,即 当前索引 - 栈顶元素,并更新最大长度。
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public int longestValidParentheses(String s) {
int maxans = 0;
Deque<Integer> stack = new LinkedList<Integer>();
stack.push(-1);
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push(i);
} else {
stack.pop();
if (stack.isEmpty()) {
stack.push(i);
} else {
maxans = Math.max(maxans, i - stack.peek());
}
}
}
return maxans;
}
}