import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
/**
* 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
* <p>
* 示例 1:
* <p>
* 输入: "(()"
* 输出: 2
* 解释: 最长有效括号子串为 "()"
* <p>
* 示例 2:
* <p>
* 输入: ")()())"
* 输出: 4
* 解释: 最长有效括号子串为 "()()"
* <p>
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/longest-valid-parentheses
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
class Solution {
public int longestValidParentheses(String s) {
if (s == null || "null".equals(s)) {
return 0;
}
int maxans = 0;
Stack<Integer> stack = new Stack<>();
stack.push(-1);
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push(i);
} else {
stack.pop();
if (stack.empty()) {
stack.push(i);
} else {
maxans = Math.max(maxans, i - stack.peek());
}
}
}
return maxans;
}
}
public class MainClass {
public static String stringToString(String input) {
if (input == null) {
return "null";
}
return input;
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
String s = stringToString(line);
int ret = new Solution().longestValidParentheses(s);
String out = String.valueOf(ret);
System.out.print(out);
}
}
}
核心思想:
对于遇到的每个 ( ,我们将它的下标放入栈中。
对于遇到的每个 ) ,我们弹出栈顶的元素并将当前元素的下标与弹出元素下标作差,得出当前有效括号字符串的长度。通过这种方法,我们继续计算有效子字符串的长度,并最终返回最长有效子字符串的长度。