ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

力扣32(java)-最长有效括号(困难)

2022-09-08 12:00:25  阅读:200  来源: 互联网

标签:栈为 java 括号 32 遇到 力扣 索引 长度 stack


题目:

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

示例 1:

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

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

输入:s = ""
输出:0
 

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

 利用栈的特点来解决问题:

参照@笨猪爆破组 大佬的题解

由于该题需要求的是最长有效括号的子串长度,那么栈中不需要存放左括号,而是存放左括号的下标。当遇到右括号时,就弹出栈顶的左括号索引,然后就更新有效长度 = 当前右括号的索引 - 栈顶左括号的索引 + 1,在更新一下最大有效长度

但是当在索引6遇到右括号时,此时栈为空,找不到与之匹配的左括号了,这时前面索引5计算的长度为4,但是实际最大长度为6,这时不知该如何继续计算...

所以就需要在最开始的时候栈里设置一个“参照物”为-1,计算有效长度 = 当前右括号的索引 - 出栈后新的栈顶索引,在后面栈为空时遇到右括号,就将右括号的索引作为新的参照物压入栈中。

前面步骤省略 

当遇到索引5时,有效长度为= 5 - (-1) = 6;

当遇到索引6时,就会将栈顶元素 -1 弹出,栈为空,将6压栈;

当遇到索引7时,7入栈;

当遇到索引8时,7出栈,有效长度= 8 - 6 = 2,更新最大长度仍为6;

当遇到索引9时,弹出栈顶元素6,栈为空,将9压栈;

当遇到索引10时,10入栈;

当遇到索引11时,10出栈,有效长度 = 11 - 9 = 2,更新最大长度仍为6;

遍历完毕,返回最大长度6。

代码:

 1 class Solution {
 2     public int longestValidParentheses(String s) {
 3         int n = s.length();
 4         Deque<Integer> stack = new ArrayDeque<>();
 5         //最先让-1入栈作为参照物
 6         stack.addLast(-1);
 7         int max = 0;
 8         for(int i = 0; i < n; i++){
 9             char c = s.charAt(i);
10             if(c == '('){
11                 stack.addLast(i);
12             }else{
13                 stack.pollLast();
14                 if(stack.isEmpty()){
15                     //栈为空就把右括号索引入栈,作为新的参照物
16                     stack.addLast(i);
17                 }else{
18                     max = Math.max(max,i - stack.peekLast());
19                 }  
20             }
21         }
22         return max;
23     }
24 }

 

标签:栈为,java,括号,32,遇到,力扣,索引,长度,stack
来源: https://www.cnblogs.com/liu-myu/p/16668410.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有