算法训练-最长有效括号

最长有效括号

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值