题目描述
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
样例描述
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
思路
技巧性 + 背过即可
合法的括号序列满足两个性质:
- 根据第二个性质,找到不合法的第一个位置,作为分割
- 对于分割出的每段,再判断这段里面的最长有效长度,首先最后一个作为分割,肯定是没法匹配的。
- 对每段里面的每个右括号的位置,枚举以这个右括号结尾的左括号的位置,求一个长度,更新所有的取一个max就是最后的结果。
代码
class Solution {
public int longestValidParentheses(String s) {
int n = s.length();
Deque<Integer> stack = new LinkedList<>();
stack.push(-1);
char ch[] = s.toCharArray();
int res = 0;
for (int i = 0; i < n; i ++ ) {
if (ch[i] == '(') {
stack.push(i);
} else {
stack.pop();
//保证栈顶存储的是最后一个还没匹配的右括号的位置
if (stack.isEmpty()) {
stack.push(i);
} else {
//当前位置减去
res = Math.max(res, i - stack.peek());
}
}
}
return res;
}
}