flag
软件学院大三党,每天一道算法题,第32天
题目介绍
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
思路
与找到每个可能的子字符串后再判断它的有效性不同,我们可以用栈在遍历给定字符串的过程中去判断到目前为止扫描的子字符串的有效性,同时能的都最长有效字符串的长度。我们首先将 -1−1 放入栈顶。
对于遇到的每个 \text{‘(’}‘(’ ,我们将它的下标放入栈中。
对于遇到的每个 \text{‘)’}‘)’ ,我们弹出栈顶的元素并将当前元素的下标与弹出元素下标作差,得出当前有效括号字符串的长度。通过这种方法,我们继续计算有效子字符串的长度,并最终返回最长有效子字符串的长度。
关键代码
public int longestValidParentheses(String s) {
char[] set=s.toCharArray();
Stack <Integer>stack=new Stack();
stack.push(-1);
int n=set.length;
int count=0;
for (int i=0;i<n;i++){
if(set[i]=='('){
stack.push(i);
}
if(set[i]==')'){
stack.pop();
if(stack.isEmpty()){
stack.push(i);
}
else {
count=Math.max(count,i-stack.peek());
}
}
}
return count;
}
总结
这道题坑比较多,第一次读题理解错了,以为是有几个括号,实际是连续有效括号的长度