最长有效括号
1.题目描述
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'
2.题目来源
3.题解
解决这道题,我们可以用栈来存取字符串的下标来判断最长有效长度
为了计算有效长度,我们需要在初始时在栈中push -1,因为当计算有有效长度时,如果一对括号的下标分别为0和1,那么求出的有效长度为1-0=1,不符合正确有效长度
如果遍历的字符为左括号,我们将字符的下标入栈
如果遍历的字符为右括号,我们让栈顶元素出栈:
1.如果此时栈为空,说明栈中没有含有值为左括号的字符的下标,我们将当前字符下标入栈,用于重置 有效下标
2.如果此时栈不为空,我们判断maxlength和i-stack[stack.length-1] (当前计算出来的有效长度)的大 小,并重新赋值
最后返回maxlength的值
var longestValidParentheses = function(s) {
const stack = []
stack.push(-1)//在初始时推入-1
let maxlength=0
for(let i = 0 ; i < s.length ; i++){
if(s[i]==='('){
stack.push(i)//如果遍历的字符为'(',将其下标入栈
}else{
//栈顶元素出栈,用于判断栈中是否含有有效括号的下标
stack.pop()
if(!stack.length){
//如果此时栈为空,则将i入栈,用于重置有效下标
stack.push(i)
}else{
//如果栈不为空,计算maxlength的值
maxlength = maxlength > (i-stack[stack.length-1]) ? maxlength : (i-stack[stack.length-1])
}
}
}
return maxlength
}