下面是leetcode的Longest Valid Parentheses的一个解法
时间复杂度为O(n) 空间复杂度为O(1)
/*
* 找出最长的配对括号的长度 例如 “)()()(”的长度为4 采用左右两遍扫描的办法
*/
public int longestValueParenthese(String s) {
// 定义存储结果的变量
int answer = 0;
// 定义配对的深度
int depth = 0;
// 定义开始位置
int start = -1;
for (int i = 0; i < s.length(); i++) {
// 遍历字符串的每一个字符 要是等于左括号 深度加一
if (s.charAt(i) == '(') {
++depth;
} else {
// 要是不是左括号 深度减少一
--depth;
if (depth < 0) {
depth = 0;
start = i;
// 当最后的深度是0的时候
} else if (depth == 0) {
// 求最后的结果
answer = Math.max(answer, i - start);
}
}
}
// 下面是从右往左扫描的情况
depth = 0;
start = s.length();
for (int i = s.length() - 1; i >= 0; --i) {
if (s.charAt(i) == ')') {
++depth;
} else {
--depth;
if (depth < 0) {
depth = 0;
start = i;
} else if (depth == 0) {
answer = Math.max(answer, start - i);
}
}
}
return answer;
}