32、最长有效括号 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(32)最长有效括号
一 题目描述

二 解法总览(思维导图)

三 全部解法
1 方案1
1)代码:
// 方案1 “滑动窗口法”。
// 通过:229 / 231,超时!
// 例子:太长,暂不罗列。
// 思路:
// 1)初始化状态。
// 2)核心:窗口大小固定为 tempL(范围:[l, 0] ) ,不断穷举所有的可能情况、然后做处理
// tempL:当前窗口大小, left、right 分别为当前窗口的左右边。
// 3)返回结果
var longestValidParentheses = function(s) {
    // 判断当前子串 tempS 是否为 有效括号
    const isValidParentheses = (tempS = '') => {
        const l = tempS.length;
        let stack = [];
        for (let i = 0; i < l; i++) {
            if (tempS[i] === '(') {
                stack.push('(');
            }
            else {
                const tempChar = stack.pop();
                if (tempChar !== '(') {
                    return false;
                }
            }
        }
        return stack.length === 0;
    };
    // 1)初始化状态。
    const l = s.length;
    // 2)核心:窗口大小固定为 tempL(范围:[l, 0] ) ,不断穷举所有的可能情况、然后做处理
    // tempL:当前窗口大小, left、right 分别为当前窗口的左右边。
    for (let tempL = l; tempL > 0; tempL--) {
        // 优化:长度为奇数,肯定不是!
        if (tempL % 2 === 1) {
            continue;
        }
        for (let left = 0; left < (l - tempL + 1); left++) {
            const right = (left + tempL - 1);
            // 优化:最左、最右的字符一定分别是 '('、')' !
            if (s[left] !== '(' || s[right] !== ')') {
                continue;
            }
            else {
                const tempS = s.slice(left, right + 1);
                if (isValidParentheses(tempS)) {
                    // 3)返回结果
                    return tempL;
                }
            }
        }
    }
    // 3.2)返回结果
    return 0;
};
2 方案2
1)代码:
// 方案2 “动态规划”。
// 思路:
// 1)我们用 dp[i] 表示以 i 结尾的最长有效括号
// 2.1)若 s[i] 为 ( ,则 dp[i] 必然等于 0,因为不可能组成有效的括号
// 2.2)若 s[i] 为 ),
// 2.2.1)且当 s[i-1] 为 (,则 dp[i] = dp[i-2] + 2;
// 2.2.2)且当 s[i-1] 为 ) && s[i-dp[i-1] - 1] 为 (,则 dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2] 。
// 3)返回结果 resLength
// 参考:
// 1)https://leetcode-cn.com/problems/longest-valid-parentheses/solution/dong-tai-gui-hua-si-lu-xiang-jie-c-by-zhanganan042/
var longestValidParentheses = function(s) {
    // 1)状态初始化
    const l = s.length;
    let dp = Array(l).fill(0),
        resLength = 0;
    // 2)核心:
    // 1)我们用 dp[i] 表示以 i 结尾的最长有效括号
    // 2.1)若 s[i] 为 ( ,则 dp[i] 必然等于 0,因为不可能组成有效的括号
    // 2.2)若 s[i] 为 ),
    // 2.2.1)且当 s[i-1] 为 (,则 dp[i] = dp[i-2] + 2;
    // 2.2.2)且当 s[i-1] 为 ) && s[i-dp[i-1] - 1] 为 (,则 dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2] 。
    for (let i = 0; i < l; i++) {
        if (i > 0 && s[i] === ')') {
            if (s[i - 1] === '(') {
                dp[i] = ((i - 2 >= 0) ? dp[i - 2] + 2 : 2);
            }
            else if (s[i - 1] === ')' && (i - dp[i - 1] - 1 >= 0) && (s[i- dp[i - 1] - 1] === '(')) {
                dp[i] = dp[i - 1] + 2 + (i - dp[i - 1] - 2 >= 0 ? dp[i - dp[i - 1] - 2] : 0);
            }
        }
        resLength = Math.max(resLength, dp[i]);
    }
    // 3)返回结果 resLength
    return resLength;
}
												
											32、最长有效括号 | 算法(leetode,附思维导图 + 全部解法)300题的更多相关文章
- 31、下一个排列 | 算法(leetode,附思维导图 + 全部解法)300题
		
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(31)下一个排列 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "双指针法 ...
 - 33、搜索旋转排序数组 | 算法(leetode,附思维导图 + 全部解法)300题
		
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(33)搜索旋转排序数组 一 题目描述! 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 & ...
 - 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
		
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
 - 35、搜索插入位置 | 算法(leetode,附思维导图 + 全部解法)300题
		
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(35)搜索插入位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "无视要 ...
 - 36、有效的数独 | 算法(leetode,附思维导图 + 全部解法)300题
		
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(36)有效的数独 前言 1)码农三少 ,一个致力于 编写极简.但齐全题解(算法) 的博主. 2)文末附赠 价值上百美刀 资料. 一 ...
 - RabbitMQ面试题集锦(精选)(另附思维导图)
		
1.使用RabbitMQ有什么好处? 1.解耦,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦! 2.异步,将消息写入消息队列,非必要的业务逻辑以异步的 ...
 - 精心整理「服务器Linux C/C++」 成长路程(附思维导图)
		
前言 我不是名校毕业,更没有大厂的背景,我只是一个毕业不到 2 年的普普通通的程序员,在摸爬滚打的工作这段时间里,深知了有一个「完整的知识体系」是非常重要的.当事人非常后悔没有在大学期间知道这个道理- ...
 - 2020年Java多线程与并发系列22道高频面试题(附思维导图和答案解析)
		
前言 现在不管是大公司还是小公司,去面试都会问到多线程与并发编程的知识,大家面试的时候这方面的知识一定要提前做好储备. 关于多线程与并发的知识总结了一个思维导图,分享给大家 1.Java中实现多线程有 ...
 - VIM基础知识整理(附思维导图)
		
这是当时初学VIM后做的一个思维导图,图片稍大,所以从freemind导出了html文本po在下面:图片在最下方,放大可清晰浏览. VIM 普通模式 普通编辑命令 功能:浏览,普通编辑 x:删除光标所 ...
 
随机推荐
- 洛谷2046 NOI2010海拔
			
QwQ题目太长 这里就不复制了 题目 这个题...算是个比较经典的平面图最小割变成对偶图的最短路了QwQ 首先考虑最小割应该怎么做. 有一个性质,就是每个点的海拔要么是1,要么是0 QwQ不过这个我不 ...
 - Ajax样例
			
$.ajax({ url : "newsservlet",//请求地址 dataType : "json",//数据格式 type : "post&q ...
 - javascript-jquery对象的动画处理
			
一.显示与隐藏动画效果 1.hide(动画持续时间,easing用来指定切换效果,动画执行完毕调用函数): $("p").hide(5000,"swing",f ...
 - Java:Set接口小记
			
Java:Set接口小记 对 Java 中的 Set接口 与 其实现类,做一个微不足道的小小小小记 概述 public interface Set<E> extends Collectio ...
 - HttpClient使用GET方式通过代理服务器读取页面的例子
			
import java.io.BufferedReader;import java.io.InputStreamReader;import org.apache.http.HttpEntity;imp ...
 - [no code][scrum meeting] Alpha 12
			
项目 内容 会议时间 2020-04-19 会议主题 周总结会议 会议时长 45min 参会人员 全体成员 $( "#cnblogs_post_body" ).catalog() ...
 - Spring Cloud Gateway Route Predicate Factory 的使用
			
Spring Cloud Gateway的使用 一.需求 二.基本组成 1.简介 2.核型概念 1.Route 路由 2.Predicate 谓语.断言 3.Filter 过滤器 3.工作原理 三.网 ...
 - spring session实现session统一管理(jdbc实现)
			
最近在看一些关于spring session 的知识,特做一个笔记记录一下. 在项目中经常会遇到这么一种情况,同一个web项目有时需要部署多份,然后使用nginx实现负载均衡,那么遇到的问题就是,部署 ...
 - 文件上传漏洞Bypass总结
			
文件上传漏洞Bypass总结 前端JS验证文件类型: 上传后缀jpg,抓包改为php后缀 ======================================================= ...
 - 【JavaScript基础】Js的定时器(你想看的原理也在哟)
			
[JavaScript基础]Js的定时器(你想看的原理也在哟) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 本章是经历 ...