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:删除光标所 ...
随机推荐
- bash手册
目录 bash手册 man命令 man man 分页程序(page) Linux手册页惯用的节名 Linux手册页的内容区域 查看命令在Linux手册页中的区域 info页面 help帮助 bash手 ...
- 常用SQL函数大全
数学函数 mod(x,y) 返回x/y的模(余数)mod(5,3)=2,mod(3,5)=3 floor(x) 返回小于x的最大整数值ceiling(3)=3,ceiling(3.1)=3 cei ...
- linux性能优化基础——iommu相关配置
此篇文档介绍了IOMMU相关的信息: https://blog.chaosjohn.com/Check-VT-D-or-IOMMU-under-Linux.html iommu和vt-d都是io半虚拟 ...
- MySQL:提高笔记-2
MySQL:提高笔记-2 学完基础的语法后,进一步对 MySQL 进行学习,第一篇为:MySQL:提高笔记-1,这是第二篇内容 说明:这是根据 bilibili 上 黑马程序员 的课程 mysql入门 ...
- 使用logstash的grok插件解析springboot日志
使用logstash的grok插件解析springboot日志 一.背景 二.解决思路 三.前置知识 四.实现步骤 1.准备测试数据 2.编写`grok`表达式 3.编写 logstash pipel ...
- 树链剖分好(du)题(liu)选做
1.luogu P4315 月下"毛景树" 题目链接 前言: 这大概是本蒟蒻A掉的题里面码量最大的一道题了.我自认为码风比较紧凑,但还是写了175行. 从下午2点多调到晚上8点.中 ...
- 三极管和MOS管驱动电路的正确用法
1 三极管和MOS管的基本特性 三极管是电流控制电流器件,用基极电流的变化控制集电极电流的变化.有NPN型三极管(简称P型三极管)和PNP型三极管(简称N型三极管)两种,符号如下: MOS管是电压控制 ...
- TensorFlow从入门到入坑(1)
初识TensorFlow 一.术语潜知 深度学习:深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法. 深度学 ...
- flex步局 11.02
语法 justify-content: flex-start | flex-end | center | space-between | space-around flex-start:弹性盒子元素将 ...
- 优客源创会 西安站 西邮Linux兴趣小组
2016年5月19日晚7:00,优客源创会西安站在西安邮电大学长安校区东区教学楼FF305如期举行,西安邮电大学计算机学院教授.西邮Linux兴趣小组指导老师陈莉君.王小银老师和来自开源中国的周凯先生 ...