最长有效括号
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
1
2
3
2
3
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
let stack = [];
let record = [];
let ans = 0;
for (let i = 0; i < s.length; i++) {
if (s[i] === "(") {
stack.push({
val: s[i],
index: i,
});
} else if (s[i] === ")" && stack.length === 0) {
continue;
} else if (s[i] === ")" && stack[stack.length - 1].val === "(") {
// 有记录的情况下
// 判断当前与上一条记录是否是包含关系,是的话直接覆盖
if (
record.length > 0 &&
stack[stack.length - 1].index < record[record.length - 1][0] &&
i > record[record.length - 1][1]
) {
record.pop();
}
// 判断当前与上一条记录是否是连续关系,是的话拼接
if (
record.length > 0 &&
record[record.length - 1][1] + 1 === stack[stack.length - 1].index
) {
let l = record[record.length - 1][0];
record.pop();
record.push([l, i]);
} else {
record.push([stack[stack.length - 1].index, i]);
}
// 每次增加记录了就判断一次最大长度
ans = Math.max(
record[record.length - 1][1] - record[record.length - 1][0] + 1,
ans
);
stack.pop();
}
}
return ans;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-valid-parentheses/