给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"
示例 3:
输入:s = "" 输出:0
提示:
0 <= s.length <= 3 * 104
s[i]
为'('
或')'
Related Topics
栈模拟,java
class Solution {
public int longestValidParentheses(String s) {
Stack<Integer> stack = new Stack<>();
stack.push(-1);
int idx = -1;
int ans = 0;
while (++idx < s.length()) {
//表示上一个未被匹配的左括号'('
if (s.charAt(idx) == '(') {
stack.push(idx);
} else {
//这里是右括号‘)’
stack.pop();
if (!stack.isEmpty()) {
ans = Math.max(ans, idx - stack.peek());
}else{
stack.push(idx);
}
}
}
return ans;
}
}
- 栈底元素是有效区间的起始位置
- 之后栈内只插入左括号
(
的位置 - 每遇到一个右括号,则从栈顶弹出一个元素
- 如果弹出的是左括号,那么就能知道当前的有效区间的长度
- 如果弹出的右括号,此时栈内为空,之前的有效区间不存在了,后面再能遇到的是新的有效区间,需要从当前位置重新开始表示,那么就把当前值插入到栈底部
- 在每次得到有效区间的时候,依次比较取较大值
发表评论