作者:沈巛小糖meimei昌策_247 | 来源:互联网 | 2024-12-15 15:57
问题概述:
给定一个长度为N的括号序列,该序列仅包含左括号'('和右括号')'。任务是确定此序列中最长的合法括号子序列,并统计满足此条件的子序列数量。合法括号子序列是指每个左括号都能找到对应的右括号进行匹配,且每个右括号也都有对应的左括号匹配。例如,((()))()() 是一个有效的括号序列,而(()))( 则不是一个有效序列。
要求计算最长合法括号子序列的长度及此类子序列的数量。
输入说明:
输入数据可能包含多组测试用例,每组测试用例包含两行:
第一行是一个整数N,表示括号序列的长度,N 的值不会超过10^6。
第二行是一个长度为N的字符串,由字符'(' 和 ')' 组成。
输出要求:
对于每一组测试用例,输出一行结果,该行包含两个整数,第一个整数表示最长合法括号子序列的长度,第二个整数表示具有该长度的子序列数量,两者之间以空格分隔。如果不存在合法的子序列,则输出0 1。
示例输入:
6
(())()
3
))(
示例输出:
6 1
0 1
import java.util.Stack;
public class BracketMatcher {
public static void findMaxValidBracketSequence(String input) {
Stack stack = new Stack<>();
int[] validBrackets = new int[input.length()];
int maxLength = 0;
int maxCount = 0;
for (int i = 0; i if (input.charAt(i) == '(') {
stack.push(i);
} else if (input.charAt(i) == ')') {
if (!stack.isEmpty()) {
int start = stack.pop();
validBrackets[start] = 1;
validBrackets[i] = 1;
}
}
}
// 计算连续的有效括号的最大长度
for (int i = 1; i if (validBrackets[i] > 0 && validBrackets[i - 1] > 0) {
validBrackets[i] += validBrackets[i - 1];
}
if (validBrackets[i] > maxLength) {
maxLength = validBrackets[i];
}
}
// 统计最大长度的有效括号序列数量
for (int length : validBrackets) {
if (length == maxLength) {
maxCount++;
}
}
System.out.println(maxLength == 0 ? "0 1" : maxLength + " " + maxCount);
}
public static void main(String[] args) {
findMaxValidBracketSequence("(()(()(");
findMaxValidBracketSequence("(())()");
findMaxValidBracketSequence("))(");
}
}