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:删除光标所 ...
随机推荐
- 创建HTML文档
目录 创建HTML文档 构筑基本的文档结构 DOCTYPE元素 DOCTYPE元素 代码清单1 使用DOCTYPE元素 html元素 html元素 代码清单2 使用html元素 head元素 head ...
- PAT (Basic Level) Practice (中文)1076 Wifi密码 (15分)
1076 Wifi密码 (15分) 下面是微博上流传的一张照片:"各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B- ...
- PAT (Basic Level) Practice (中文)1026 程序运行时间 (15分)
1026 程序运行时间 (15分) 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费 ...
- LuckySheet一款在线Excel使用心得
1.LuckySheet简介 Luckysheet ,是一款国产的纯JS实现的类似excel的在线表格,功能强大.配置简单.完全开源. 开源地址 https://gitee.com/mengshuke ...
- 2021.8.3考试总结[NOIP模拟29]
T1 最长不下降子序列 数据范围$1e18$很不妙,但模数$d$只有$150$,考虑从这里突破. 计算的式子是个二次函数,结果只与上一个值有关,而模$d$情况下值最多只有$150$个,就证明序列会出现 ...
- 常见SOC启动流程分析
本文以s5pv210这款SOC为例,分析了其启动流程 在s5pv210的SOC内部,存在着一个内部的ROM和一个内部的RAM 这个内部的ROM叫做 IROM,它是norflash的一种.其不同于板子上 ...
- vim 常用操作技巧
记录常用的vim操作技巧,基本满足90%的日常编辑使用. 文档操作 vim test.txt 打开当前目录下的test.txt文档,若不存在则创建该文件 :w 保存当前修改到文件 :w bak.txt ...
- centos7 使用iptables
关闭selinux,不关闭时,iptables不读取配置文件 重启生效 centos7 中默认的防火墙是firewalld,使用iptables需要先关闭firewalld防火墙,安装iptables ...
- 2万字|30张图带你领略glibc内存管理精髓(因为OOM导致了上千万损失)
前言 大家好,我是雨乐. 5年前,在上家公司的时候,因为进程OOM造成了上千万的损失,当时用了一个月的时间来分析glibc源码,最终将问题彻底解决. 最近在逛知乎的时候,发现不少人有对malloc/f ...
- 『学了就忘』Linux基础命令 — 23、文件基本权限的介绍和作用
目录 1.基本权限的介绍 (1)权限位的含义 (2)权限的优先级 2.权限的基本作用 (1)权限含义的解释 (2)目录权限说明 1.基本权限的介绍 (1)权限位的含义 前面讲解ls命令时,我们已经知道 ...