Problem: 32. 最长有效括号
题目描述
思路及解法
1.创建一个栈,并将-1先添加到栈中(添加-1到栈中只是为了方便接下来的操作),定义int变量len用于记录每一个子有效括号的长度,maxLen记录最长有效括号;
2.遍历字符串若遇到一个左括号则直接将其在字符串中的索引下标压到栈顶;
3.遍历字符串若遇到一个右括号,先将栈顶元素弹出,若当前栈不为空,则将当前右括号在字符串中的索引下标减去已经弹出一个栈顶元素后的栈中栈顶元素值(栈中存储的均为括号在字符串中的索引下标)并更新len与maxLen;若当前栈为空则直接将当前元素的索引下标压入栈。
复杂度
时间复杂度:
O ( n ) O(n) O(n);其中 n n n为字符串s的长度
空间复杂度:
O ( n ) O(n) O(n)
Code
class Solution {
/**
* Longest Valid Parentheses(Stack)
*
* @param s Given string
* @return int
*/
public int longestValidParentheses(String s) {
Stack<Integer> stack = new Stack<>();
stack.push(-1);
int len = 0;
int maxLen = 0;
for (int i = 0; i < s.length(); ++i) {
if (s.charAt(i) == '(') {
stack.push(i);
} else {
//Pop the top element and calculate
//the length of valid parentheses
stack.pop();
if (stack.isEmpty()) {
stack.push(i);
} else {
len = i - stack.peek();
maxLen = Math.max(len, maxLen);
}
}
}
return maxLen;
}
}