删除内部单词

时间:2017-11-21 21:31:36

标签: java string algorithm

我将通过删掉单词来生成不同的句子。我认为这可能是一个众所周知的问题,但我找不到它。

作为一个例子: 如果我有一个这样的句子“0 1 2 3 4”有5个令牌 它必须生成: -

  • 0 2 3 4
  • 0 1 3 4
  • 0 1 2 4
  • 0 1 4
  • 0 2 4
  • 0 3 4
  • 0 4

我写了一个代码,在句子中包含多个单词,然后生成我想要的所有可能的句子。 我的代码是

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)时 你可以意识到它错过了非连续的情况,比如

  • 0 2 4 “0 __ 2 __ 4”

如下所示,我生成连续单词“空白”或“删除”的句子

                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;

如何修改算法以查找这些案例?

1 个答案:

答案 0 :(得分:0)

谢谢大家的努力。 我意识到解决这个问题的更好方法。 您可以将每个字符串视为二进制数,然后迭代它,如果找到0,则必须删除该字。

然后每个字符串的可能值是什么?! 如果你的字符串中的单词数是4,那么你可能生成的字符串将介于2 ^ 3 + 1和2 ^ 4-1之间。你可以忽略两个范围之间的所有偶数,因为它将以0结尾,你不应该删掉最后一个单词。

例如,“0 1 2 3”字符串有4个单词,因此会生成

  • 1001(0 _ _ 3)
  • 1011(0 _ 2 3)
  • 1101(0 1 _ 3)

在我的情况下有5个字: -

  • 10001(0 4)
  • 10011(0 3 4)
  • 10101(0 2 4)
  • 11001(0 1 4)
  • 11011(0 1 3 4)
  • 11101(0 1 2 4)
  • 10111(0 2 3 4

代码是:

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");
    }
}