LeetCode32. 最长有效括号
作者:互联网
LeetCode32. 最长有效括号
题目描述
/**
*
* 给你一个只包含 '(' 和 ')' 的字符串,
* <p>
* 找出最长有效(格式正确且连续)括号子串的长度。
*
*/
思路分析
- 基于栈的先进后出特性,可以巧妙的解决左右括号匹配的问题
- 即左括号先入栈,然后拿右括号来匹配,如果匹配成功,则左括号出栈
- 此题目难点在于连续,要保证包含左右括号的字符串格式正确且连续,需要转换一种思路,即在栈底始终存放一个没有与左括号匹配的右括号的索引,初始假定索引为-1,在遍历字符串的时候,如果有右括号没有与之对应的左括号,则将该右括号的索引存入栈底,开始下一个连续子串的长度计算
- 详解见下
源码及分析
public int longestValidParentheses(String s) {
//数据校验
int len = s.length();
if (s == null || len < 2) {
return 0;
}
//定义count保存子串的长度
int count = 0;
//定义栈保存括号
Stack<Integer> stack = new Stack<>();
//栈底存放没有被匹配的右括号的索引,栈中维护一个左括号的索引
stack.push(-1);
for (int i = 0; i < len; i++) {
//如果是左括号,直接入栈
if (s.charAt(i) == '(') {
stack.push(i);
//如果是右括号
} else {
//先弹出栈顶的元素,即左括号与当前右括号进行匹配
stack.pop();
//匹配成功后如果栈不为空,则说明子串连续,记录长度,即用当前位置元素索引 - 栈顶左括号的索引
if (!stack.isEmpty()) {
count = Math.max(count, i - stack.peek());
} else {
//出栈一个元素后如果栈为空,说明出栈的是 -1,即栈中没有左括号和当前右括号匹配,即不连续,
// 将当前右括号的索引入栈,保证栈底始终维护的是没有匹配的右括号的索引
stack.push(i);
}
}
}
return count;
}
标签:count,匹配,索引,stack,括号,栈底,LeetCode32,最长 来源: https://www.cnblogs.com/mx-info/p/14798328.html