【发布时间】:2013-08-04 17:13:46
【问题描述】:
我们有:
n1{}括号的数量,n2()括号的数量,n3[]括号的数量,
这些括号有多少种不同的有效组合?
我的想法:我用java写了一个蛮力代码(下面有)并计算了所有可能的组合,我知道这是可能的最糟糕的解决方案,
(代码是针对一般情况,我们可以有不同类型的括号)
任何数学方法?
注 1:有效组合通常定义,例如{{()}}:有效,{(}){}:无效
注 2:假设我们有 2 对 {} ,1 对 () 和 1 对 [],有效组合的数量为 168 和所有可能的数量(有效和无效) 组合为 840
static void paranthesis_combination(char[] open , char[] close , int[] arr){
int l = 0;
for (int i = 0 ; i < arr.length ; i++)
l += arr[i];
l *= 2;
paranthesis_combination_sub(open , close , arr , new int[arr.length] , new int[arr.length], new StringBuilder(), l);
System.out.println(paran_count + " : " + valid_paran_count);
return;
}
static void paranthesis_combination_sub(char[] open , char[] close, int[] arr , int[] open_so_far , int[] close_so_far, StringBuilder strbld , int l){
if (strbld.length() == l && valid_paran(open , close , strbld)){
System.out.println(new String(strbld));
valid_paran_count++;
return;
}
for (int i = 0 ; i < open.length ; i++){
if (open_so_far[i] < arr[i]){
strbld.append(open[i]);
open_so_far[i]++;
paranthesis_combination_sub(open , close, arr , open_so_far , close_so_far, strbld , l);
open_so_far[i]--;
strbld.deleteCharAt(strbld.length() -1 );
}
}
for (int i = 0 ; i < open.length ; i++){
if (close_so_far[i] < open_so_far[i]){
strbld.append(close[i]);
close_so_far[i]++;
paranthesis_combination_sub(open , close, arr , open_so_far , close_so_far, strbld , l);
close_so_far[i]--;
strbld.deleteCharAt(strbld.length() -1 );
}
}
return;
}
【问题讨论】:
-
如何定义一个有效的组合?根据解析规则,这个问题可能有很多不同的答案。
-
问题现已编辑
-
查找加泰罗尼亚数字。 ({}) 有效吗?
-
你知道 StackExchange 得到了Math section?我相信他们可能更擅长数学答案:-p
标签: math recursion combinations discrete-mathematics