2025年--Lc229-32. 最长有效括号(栈)-Java版
1.题目

2.思路
用栈存“尚未匹配的左括号索引”;额外压入一个哨兵 -1 当“基准起点”。遇到右括号)时先弹出一个左括号(;
若左括号栈空了,说明这个)无法匹配,就把它的索引当成新的基准压栈;
若栈没空,当前有效长度 = 当前索引 i − 栈顶索引,更新答案。
-1 表示“最左侧边界的前一位”。当一开始就出现一段合法串(比如 “()” 从下标 0 开始),长度就能算成 i - (-1)。
如果某个)不匹配,我们把它的下标压栈,充当“新的左边界前一位”。


3.代码实现
带测试用例
import java.util.Stack;public class longestValidParentheses {public int longestValid(String s){ //存储括号的索引Stack<Integer> st=new Stack<>();//先push一个哨兵元素,也就是左边界st.push(-1);int max=0;for(int i=0;i<s.length();i++){if(s.charAt(i)=='(')//如果遇到左括号(直接入栈{st.push(i);}else{//遇到右括号st.pop();//先弹出哨兵元素,或者如果有遇到左括号,先弹出左括号if(st.isEmpty())//如果栈为空{//说明)右括号多余,栈中没有匹配的左括号,所以右括号把自己作为标准元素st.push(i);}else{//如果栈不空,说明有多余的左括号max=Math.max(max,i-st.peek());//栈的堆顶元素比如0,对应左括号,所以2-0=2}}}return max;}public static void main(String[] args){String s= ")()())";longestValidParentheses test=new longestValidParentheses();int cnt=test.longestValid(s);System.out.println(cnt);}}
leetcode模式
class Solution {public int longestValidParentheses(String s) {Stack<Integer> st=new Stack<>();//栈记录括号的索引下标int cnt=0;// 关键:放入-1作为参照物st.push(-1);for(int i=0;i<s.length();i++){if(s.charAt(i)=='('){st.push(i);}else//如果是右括号){st.pop();// 弹出一个元素(if(st.isEmpty()){// 如果栈空了, 说明当前的 ')' 没有匹配的 '('// 把当前 ')' 的索引放入,作为新的参照物st.push(i);}else{//如果栈不空,栈存的都是左括号// 长度 = 当前索引 - 新的栈顶索引cnt=Math.max(cnt,i-st.peek());}}}return cnt;}
}
