首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >leetcode 32. 最长有效括号 js实现

leetcode 32. 最长有效括号 js实现

作者头像
蓓蕾心晴
发布2022-10-30 13:56:10
发布2022-10-30 13:56:10
8980
举报
文章被收录于专栏:前端小叙前端小叙

https://leetcode.cn/problems/longest-valid-parentheses/

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1:

输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()" 示例 2:

输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()" 示例 3:

输入:s = "" 输出:0

提示:

0 <= s.length <= 3 * 104 s[i] 为 '(' 或 ')'

代码语言:javascript
复制
/**
 * @param {string} s
 * @return {number}
 */

// 算法思路:
// 我们利用一个栈,里面先存入一个-1,方便后面计算有效子串长度,我们栈中的栈首元素是为后面计算有效长度做标记。
// 遍历字符串,
// 若遇到'(',就把下标入栈;
// 若遇到')',就出栈;
// 若栈为空,说明该子串无效,因为我们的栈首存放的是标记位,并非'('的下标,那么我们就把当前的i入栈,作为新子串的标记位;
// 若栈不为空,说明该字串有效,那么更新最长子串长度result = Math.max(result, i-stack.peek());
// 该算法的巧妙之处,正是栈首存放的是标记位,而非记录'('的下标。
var longestValidParentheses = function(s) {
    let max = 0
    if (s.length < 1) return max

    let len = s.length

    // 栈顶之所有加入一个-1,纯粹是为了方便计算有效括号的长度
    // 不然就需要手动调整为i-j+1;同时而确保第一个字符为")"时不需要特殊处理
    let stack = [-1]

    for(let i = 0; i < len; i++) {
        let value = s[i]
        if (value === '(') {
        stack.push(i)
        } else if (value === ')') {
        stack.pop()


        // 栈顶加入一个pivot字符")",实际上是方便计算有效括号串长度
        if (stack.length < 1) {
            stack.push(i)
        } else {
            max = Math.max(max, i - stack[stack.length - 1])
        }
        }
    }


    return max
};

参考链接

https://zhuanlan.zhihu.com/p/145360116

https://leetcode.cn/problems/longest-valid-parentheses/solution/jsjie-ti-si-lu-qing-xi-ming-liao-by-inte-fn4c/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档