当前位置:网站首页>【力扣刷题】32. 最长有效括号
【力扣刷题】32. 最长有效括号
2022-07-06 12:56:00 【李小恩恩子】
目录
方法一:
题目:
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
方法一:
解题思路:
利用栈,学过利用栈来判断一个只包含'('和')'的字符串是否是括号匹配的,那个题目解题就是,遍历整个字符串,是左括号就入栈,是右括号则①判断栈是否有左括号且弹出一个左括号,②如果栈为空则为false,如果所有字符都遍历完了,栈中还有元素则为false,否则为true。
利用这个思路,增加一个标记数组arr,初始化所有元素为1,栈中存的是数组下标(字符索引)。遍历整个字符串,如果是左括号则把索引下标(i)加入栈,如果是右括号则判断栈中元素是否为空且不为空则弹出,并把标记数组对应的元素arr[stack.pop()]以及当前下标对应的标记数组元素arr[i]置为0。
最后判断标记数组arr的最长连续0就可以了。
代码:
class Solution {
public int longestValidParentheses(String s) {
//要找最长的有效括号
//栈
//利用栈来标记左右括号是否有效,栈的内容存下标i
Stack<Integer> stack = new Stack<>();
int[] valid = new int[s.length()];
for(int i = 0; i < s.length(); i++){
valid[i] = 1;
}
for(int i = 0; i < s.length();i++){
if(s.charAt(i) == '(') stack.push(i);
else{
if(!stack.empty()){
valid[i] = 0;
valid[stack.pop()] = 0;
}
}
}
int res = 0,count = 0;
for(int i = 0; i < s.length();i++){
if(valid[i] == 1) {
count = 0;
}else{
count++;
}
res = Math.max(res,count);
}
return res;
}
}
方法二:
解题思路:
动态规划,利用dp[i]表示以下标i字符结尾的最长有效括号的长度。将dp数组全部初始化为0。有效的子串一定以')'结尾,以'('结尾的子串对应的dp值必定为0。所以只需要求解以')'在dp数组中对应位置的值。所以从前往后遍历字符串,求解dp值。
①s.charAt(i)=')'且s.charAt(i-1)='(',字符串为"...()"则dp[i] = dp[i-2]+2。
②如果s.charAt(i) = ')'且s.charAt(i-1) = ')',比如字符串"...))"->"()(())",
如果s.charAt(i - dp[i - 1] - 1)='(',那么有效括号长度新增长度2,i位置对最长有效括号长度为 i-1位置的最长括号长度加上当前位置新增的2,不过得注意,i − dp[i − 1] − 1 和 i 组成了有效括号对,这将是一段独立的有效括号序列,如果之前的子序列是形如 (...)(...) 这种序列,那么当前位置的最长有效括号长度还需要加上这一段。例如:()(()),左边红色的和右边绿色的为两个独立的有效括号序列。所以状态转移方程为:dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] -2 ]。
图示:
还要注意边界值,因为要用到 dp[ i - 2 ],还有dp[ i - dp[ i - 1 ] - 2 ],要判断。
代码:
class Solution {
public int longestValidParentheses(String s) {
//动态规划
//dp[i]表示以下标i字符结尾的最长有效括号的长度
int res = 0;
int[] dp = new int[s.length()];
for(int i = 1;i < s.length();i++){
if(s.charAt(i) == ')'){
if(s.charAt(i-1) == '('){
if(i >= 2) dp[i] = dp[i - 2] + 2;
else dp[i] = 2;
}else if(i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '('){
if(i - dp[i - 1] >= 2) dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2;
else dp[i] = dp[i - 1] + 2;
}
}
res = Math.max(res,dp[i]);
}
return res;
}
}
方法二看了看解析,不太会写动态规划,下次找个机会专门练一练动态规划的题目。
边栏推荐
- 什么是RDB和AOF
- 数据湖(八):Iceberg数据存储格式
- @GetMapping、@PostMapping 和 @RequestMapping详细区别附实战代码(全)
- 【mysql】触发器
- HMS core machine learning service creates a new "sound" state of simultaneous interpreting translation, and AI makes international exchanges smoother
- 1_ Introduction to go language
- Reviewer dis's whole research direction is not just reviewing my manuscript. What should I do?
- 审稿人dis整个研究方向已经不仅仅是在审我的稿子了怎么办?
- 硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件
- 全网最全的知识库管理工具综合评测和推荐:FlowUs、Baklib、简道云、ONES Wiki 、PingCode、Seed、MeBox、亿方云、智米云、搜阅云、天翎
猜你喜欢
Aiko ai Frontier promotion (7.6)
15million employees are easy to manage, and the cloud native database gaussdb makes HR office more efficient
新型数据库、多维表格平台盘点 Notion、FlowUs、Airtable、SeaTable、维格表 Vika、飞书多维表格、黑帕云、织信 Informat、语雀
Distributed ID
Reviewer dis's whole research direction is not just reviewing my manuscript. What should I do?
Reference frame generation based on deep learning
ICML 2022 | Flowformer: 任务通用的线性复杂度Transformer
3D face reconstruction: from basic knowledge to recognition / reconstruction methods!
愛可可AI前沿推介(7.6)
Is this the feeling of being spoiled by bytes?
随机推荐
防火墙基础之外网服务器区部署和双机热备
Forward maximum matching method
Variable star --- article module (1)
【深度学习】PyTorch 1.12发布,正式支持苹果M1芯片GPU加速,修复众多Bug
Laravel笔记-自定义登录中新增登录5次失败锁账户功能(提高系统安全性)
基于深度学习的参考帧生成
Taylor series fast Fourier transform (FFT)
Thinking about agile development
3D人脸重建:从基础知识到识别/重建方法!
What's the best way to get TFS to output each project to its own directory?
Seven original sins of embedded development
[MySQL] basic use of cursor
Manifest of SAP ui5 framework json
js 根据汉字首字母排序(省份排序) 或 根据英文首字母排序——za排序 & az排序
Huawei device command
Swagger UI教程 API 文档神器
JS operation DOM element (I) -- six ways to obtain DOM nodes
What is the problem with the SQL group by statement
039. (2.8) thoughts in the ward
js之遍历数组、字符串