时间限制: 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);
}
}