给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
例:输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"
思路:左括号入栈,遇到右括号。弹出栈顶元素。若栈不为空,表明当前右括号元素匹配成功。当前右括号下标与下一个栈顶元素的差就是最长长度。只要右括号还能遇到栈顶是左括号的元素,表明当前有效长度依然有效。
public static int longestValidParentheses(String s) {
//初始化匹配括号数据
Map<Character, Character> map = new HashMap<>(16);
map.put(')', '(');
//使用栈进行数据处理,括号匹配.为了计算方便。将-1入栈。在计算有效长度时方便解决数组下标从0开始的问题
Stack<Integer> stack = new Stack<>();
stack.push(-1);
//记录当前元素时的匹配数,如果匹配上,则数据为2,为匹配上数据为0
int maxValidNum = 0;
for (int i = 0; i < s.length(); i++) {
//右括号
if (map.containsKey(s.charAt(i))) {
//出栈栈顶元素。为了计算当前下标与下一栈顶元素的差值=当前最长有效长度
stack.pop();
//栈空,说明碰到了不是左括号的栈顶元素。将当前元素入栈,当前元素没有匹配成功
if (stack.isEmpty()) {
stack.push(i);
} else {
maxValidNum = Math.max(maxValidNum, i - stack.peek());
}
} else {
//左括号,则下标入栈
stack.push(i);
}
}
return maxValidNum;
}
网友评论