题目
这里有另一个关于处理合法的括号序列的问题。
如果插入“+”和“1”到一个括号序列,我们能得到一个正确的数学表达式,我们就认为这个括号序列是合法的。例如,序列"(())()", "()"和"(()(()))"是合法的,但是")(", "(()"和"(()))("是不合法的。
这里有一个只包含“(”和“)”的字符串,你需要去找到最长的合法括号子段,同时你要找到拥有最长长度的子段串的个数。
收起
输入
第一行是一个只包含“(”和“)”的非空的字符串。它的长度不超过 1000000。
输出
输出合格的括号序列的最长子串的长度和最长子串的个数。如果没有这样的子串,只需要输出一行“0 1”。
输入样例
)((())))(()())
输出样例
6 2
Java:
import java.math.BigInteger;
import java.util.*;
public class testOne {
public static void main(String[] args) throws Exception{
Scanner input=new Scanner(System.in);
Stack<Character> stack=new Stack<Character>();
List<Integer> list=new ArrayList<Integer>();
String str=input.nextLine();
char c;
for(int i=0;i<str.length();i++) {
c=str.charAt(i);
if(c=='(') {
stack.push(c);
list.add(i);
}else {
if(stack.isEmpty()) {
stack.push(c);
list.add(i);
}else {
if(stack.peek()=='(') {
stack.pop();
list.remove(stack.size());
}else {
stack.push(c);
list.add(i);
}
}
}
}
list.add(str.length());
int[] num=new int[list.size()];
int n=0;
if(list.get(0)==0) {
num[0]=list.get(0)-0+1;
}else {
num[0]=list.get(0)-0;
}
for(int i=1;i<list.size();i++) {
num[i]=list.get(i)-list.get(i-1)-1;
}
Arrays.sort(num);
if(num[num.length-1]==1) {
num[num.length-1]=0;
n=1;
}else {
for(int i=num.length-1;i>=0;i--) {
n++;
if(num[i]!=num[i-1]) {
break;
}
}
}
System.out.printf("%d %d",num[num.length-1],n);
}
}