题目
给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())
" 输出: 4 解释: 最长有效括号子串为"()()"
思路
扫描一遍,借用栈,将所有匹配的括号的索引处 全部置字符'0'
例如: "()(()"的mark为【 0, 0, (, 0, 0 】
再例如: ")()((())"的mark为【 ), 0, 0, (, 0, 0, 0, 0 】
经过这样的处理后, 此题就变成了寻找最长的连续的0的长度
解答1:
/*
扫描一遍,借用栈,将所有匹配的括号的索引处 全部置字符'0'
例如: "()(()"的mark为【 0, 0, (, 0, 0 】
再例如: ")()((())"的mark为【 ), 0, 0, (, 0, 0, 0, 0 】
经过这样的处理后, 此题就变成了寻找最长的连续的0的长度
*/
public int longestValidParentheses(String s) {
char[] charArr = s.toCharArray();
Stack<String> stack = new Stack<>();
for (int i = 0; i < charArr.length; i++) {
char ch = charArr[i];
// 如果是左括号,则把括号和索引压栈
if (ch == '(') {
stack.push(ch + "_" + i);
}
// 如果是右括号,并且栈顶也是左括号
if (ch == ')' && !stack.isEmpty() && stack.peek().startsWith("(")) {
String tmpStr = stack.peek();
stack.pop();
// 那么:右括号所在索引位置 元素置0
String[] tmpArr = tmpStr.split("_");
int tmpIndex = Integer.parseInt(tmpArr[1]);
charArr[tmpIndex] = '0';
// 当前的索引也置0
charArr[i] = '0';
}
}
// 遍历数组,统计最长连续的 ‘0’
int result = 0;
int k = 0;
for (int i = 0; i < charArr.length; i++) {
if (charArr[i] == '0') {
k++;
result = Math.max(result, k);
} else {
k = 0;
}
}
return result;
}
解答2:动态规划