我正在尝试实现一个方法,该方法给出一个正整数n和一个数字k生成所有字符串,其中长度为n的1和2都恰好为k 2。
我已经为k = 2完成了如下操作:
static String[] stringgen()
{
String[][] a = new String[7][21];
String[] b = new String[21];
for(int i = 0; i < 21; i++)
b[i] = "";
for(int j = 0; j < 7;j++)
for(int i = 0; i < 21; i++)
a[j][i] = "1";
int j = 0;
for(int k = 0; k < 7;k++)
{
String c = "";
for(int i = k+1; i < 7; i++)
{
a[k][j]="2"; a[i][j]= "2";
for(int l = 0; l<7;l++)
b[j] = b[j]+a[l][j];
j++;
}
}
return b;
}
正如你所看到的,n是7而k是2所以该方法生成所有这样的字符串,但我想不出一种方法来做n = 7和k = 3这个问题。这个问题基本上等于找到n集的k个子集,我已经考虑过这样做,然后根据n个集合标记字符串,但这种方式似乎对我实际需要的东西来说有点低效。
感谢任何帮助。谢谢。
答案 0 :(得分:0)
您可以以递归方式解决问题。在任何一步,如果你手中有2个,你可以把它放在那里。如果在任何阶段你已经使用了所有的K 2,那么只需填写1。
该想法的实施。代码未经过测试
void generateAllStrings(int len, int K, String str) {
if(len == 0) {
// base case
// push string str to arrayList or use anywhere
return;
}
if(K > 0) {
generateAllStrings(len - 1, K - 1, str + '2'); // as we have positive number
// of 2 in hand, let's use one
}
if(len > K) {
// len > K so we can place a 1 here if we want
generateAllStrings(len - 1, K, str + '1'); // note K is not decreased here
}
}