我将通过删掉单词来生成不同的句子。我认为这可能是一个众所周知的问题,但我找不到它。
作为一个例子: 如果我有一个这样的句子“0 1 2 3 4”有5个令牌 它必须生成: -
我写了一个代码,在句子中包含多个单词,然后生成我想要的所有可能的句子。 我的代码是
public static void TestPattern(int numOfWords) {
int blankCount=1;
while(blankCount<numOfWords-1) {
for(int i=1;i<=numOfWords-blankCount-1;i++) {
for(int j=0;j<=numOfWords-1;j++) {
boolean blankFound=false;
for(int z=0;z<blankCount;z++) {
if(j==i+z) {
blankFound=true;
break;
}
}
if(blankFound==false) {
System.out.print(j+" ");
}else {
System.out.print("_ ");
}
}
System.out.print("\n");
}
blankCount++;
}
}
当我调用此函数 TestPattern(5)时 你可以意识到它错过了非连续的情况,比如
如下所示,我生成连续单词“空白”或“删除”的句子
for(int z=0;z<blankCount;z++) {
if(j==i+z) {
blankFound=true;
break;
}
}
if(blankFound==false) {
System.out.print(j+" ");
}else {
System.out.print("_ ");
}
还使用blankCount变量进行迭代,以便通过删除一个,两个连续的...等词来生成字符串
int blankCount=1;
如何修改算法以查找这些案例?
答案 0 :(得分:0)
谢谢大家的努力。 我意识到解决这个问题的更好方法。 您可以将每个字符串视为二进制数,然后迭代它,如果找到0,则必须删除该字。
然后每个字符串的可能值是什么?! 如果你的字符串中的单词数是4,那么你可能生成的字符串将介于2 ^ 3 + 1和2 ^ 4-1之间。你可以忽略两个范围之间的所有偶数,因为它将以0结尾,你不应该删掉最后一个单词。
例如,“0 1 2 3”字符串有4个单词,因此会生成
在我的情况下有5个字: -
代码是:
public static void TestPatternBits(int numOfWords) {
int end=1<<numOfWords;
int start=1<<(numOfWords-1);
for(int i=start+1;i<end-1;i+=2) {
int temp=i;
while(temp>0) {
if(temp%2==0) {
System.out.print("0");
}else {
System.out.print("1");
}
temp/=2;
}
System.out.print("\n");
}
}