学习笔记--递归括号序列(java)

时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分
            【问题描述】
            给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合法,
            当添加完成后,会产生不同的添加结果,请问有多少种本质不同的添加结果。
            两个结果是本质不同的是指存在某个位置一个结果是左括号,而另一个是右括
            号。
            例如,对于括号序列 (((),只需要添加两个括号就能让其合法,有以下几
            种不同的添加结果:()()()、()(())、(())()、(()()) 和 ((()))。
            【输入格式】
            输入一行包含一个字符串 s,表示给定的括号序列,序列中只有左括号和
            右括号。
            【输出格式】
            输出一个整数表示答案,答案可能很大,请输出答案除以 1000000007 (即
            10 9 + 7) 的余数。
            【样例输入】
            ((()
            【样例输出】
            5
            【评测用例规模与约定】
            对于 40% 的评测用例,|s| ≤ 200。
            对于所有评测用例,1 ≤ |s| ≤ 5000。
    
    我感觉大概意思是补全括号然后算出括号的有多少种结果
    先遍历括号,找到缺少的括号补全
    补全之后,利用递归来把所有可能的结果尝试出来,
    (因为没有具体的测试,只是测试了一个例子,可能会超时,也没做过其他解)

public static void main(String[] args) {
		String s="((()";
		int left=0,right=0;
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i) == '(') left++;
			if(s.charAt(i) == ')') right++;
		}
		while(true) {
			if(left == right) break;
			if(left > right) right++;
			if(left < right) left++;			
		}
		List<String>list=new ArrayList<>();
		fun(left,right,s,list);
		System.out.println(list.size()%1000000007);
	}
	public static void fun(int i,int j,String s,List<String>list) {
		if(i == 0 && j == 0) {
			list.add(s);
			return;
		}
		if(i>0) {
			fun(i-1,j,s+"(",list);
		}
		if(i<j) {
			fun(i,j-1,s+")",list);
		}		
	}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值