[LeetCode] 32. 最长有效括号(java实现)
1. 题目
2. 读题(需要重点注意的东西)
思路(括号合法的两个结论):
因此我们可以根据性质①,将一段括号字符串划分为若干段
,然后在每一段中找合法的括号,最后计算出最长的括号数;
如图所示
3. 解法
---------------------------------------------------解法---------------------------------------------------:
class Solution {
public int longestValidParentheses(String s) {
// 用栈存储字符下标
Stack<Integer> stk = new Stack<>();
// 用res记录最大长度
int res = 0;
// start为每一段括号的前一个位置
for(int i = 0,start = -1;i < s.length();i++){
// 如果是左括号则进栈
if(s.charAt(i) == '(') stk.push(i);
else{ // 如果当前元素是右括号
if(stk.isEmpty() == false){ // 如果栈不为空
stk.pop(); // 左右括号匹配,pop
if(stk.isEmpty() == false){ // 如果栈还不为空,说明左括号匹配完了,此时当前前缀中左括号数量小于右括号数量,计算长度 i - stk.peek()
// 计算最大长度
res = Math.max(res,i - stk.peek());
}else{ // 如果pop后栈为空,说明全部都能被匹配上,计算长度i - start
// 计算最大长度
res = Math.max(res,i - start);
}
}else{ // 如果栈为空,则说明不匹配了,右括号数大于了左括号数
// 将start跳转到现在的i上作为分割线
start = i;
}
}
}
return res;
}
}
可能存在的问题: