51Nod【1478】-括号序列的最长合法子段

题目

这里有另一个关于处理合法的括号序列的问题。

如果插入“+”和“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);   
	 }

}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值