题目
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
示例 3:
输入:s = “”
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 ‘(’ 或 ‘)’
题解
解题方式:栈法
解题思路:依次将括号加入到栈中,当出现()的情况将这对括号弹出栈并记录下位置信息,就这样直到没有更多的括号可以加入到栈中。
代码实现:
var longestValidParentheses = function (s) {
let res = [];
s = Array.from(s).map((item, index) => {//将输入的数据改成[[index,value],[]...]是我形式
return [index, item];
});
let len = s.length;//初始长度
let key = 0;//初始位置
while (key + 1 < len) {//越界时退出循环
const first = s[key][1];//当前位置的值
const last = s[key + 1][1];//下一个位置的值
if ((first === '(') && (last === ')')) {//匹配到了正确的一对括号
res[s[key][0]] = 0;//记录下当前位置
res[s[key + 1][0]] = 0;//记录下当前位置
s.splice(key, 2)//模拟弹出栈
len = s.length//重新计算栈长度
if (key - 1 < 0) {//指针向下越界时 将指针位置指向指向现在的位置
key = key
} else {//向下指针没有越界
key -= 1//指针向下一格
}
} else {//没有匹配到正确的括号
key += 1;//指针向上一格
}
}
function maxL(arr) {//计算0连续出现的最长长度
let res = 0;
let temp = 0;
let len = arr.length+1;
for (let index = 0; index < len; index++) {
if (arr[index] === 0) {
temp += 1;
} else {
temp > res && (res = temp);
temp = 0;
}
}
console.log(res)
return res
}
return maxL(res);
};