最长有效括号
难度:
标签:
题目描述
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"
示例 3:
输入:s = "" 输出:0
提示:
0 <= s.length <= 3 * 104
s[i]
为'('
或')'
代码结果
运行时间: 28 ms, 内存: 15 MB
/*
* 思路:
* 使用堆栈来跟踪未匹配的'('的索引。初始状态下,push -1到堆栈中作为基础。
* 遍历字符串s,如果是'(',将索引推入堆栈。
* 如果是')',从堆栈中弹出。若堆栈为空,推入当前索引,否则计算当前有效括号长度。
*/
import java.util.Stack;
public class Solution {
public int longestValidParentheses(String s) {
Stack<Integer> stack = new Stack<>();
stack.push(-1);
int maxLen = 0;
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 {
maxLen = Math.max(maxLen, i - stack.peek());
}
}
}
return maxLen;
}
}
解释
方法:
该题解使用栈来解决问题。遍历字符串,遇到左括号就将其索引入栈,遇到右括号则将栈顶元素出栈,并更新最长有效括号子串的长度。如果栈为空,则将当前索引 i 赋值给 j,表示上一个最长有效括号子串的结束位置。最后返回最长有效括号子串的长度。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在遇到右括号且栈为空时,需要将当前索引赋值给变量j,这样做有什么作用?
▷🦆
如果栈中有剩余的左括号索引未被匹配,那么这些情况如何影响最长有效括号子串的计算?
▷🦆
在计算最长有效括号子串长度时,为什么使用`i - top`而不是其他计算方式?
▷🦆
代码中的`top`变量在栈为空后是如何处理的,为何可以直接使用j作为新的起点?
▷