【问题标题】:Generate different sentences by dropping inner words通过删除内部单词生成不同的句子
【发布时间】:2017-11-21 21:31:36
【问题描述】:

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

例如: 如果我有这样的句子 "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”

正如你在下面看到的,我生成的句子带有连续的单词“blank out”或“dropped”

                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;

如何修改我的算法以找到这些情况?

【问题讨论】:

  • 我对这个问题投了反对票,因为没有证据表明对此代码执行了任何调试。请edit您的问题向我们展示您的调试发现了什么,以及关于特定代码行的特定问题。请参阅:How to create a Minimal, Complete, and Verifiable exampleHow to Debug Small Programs
  • 我做到了。但我无法编写算法以获取未命中案例
  • 定义您尝试实现的算法。添加到您的代码 (1) 有意义的变量名; (2) cmets 根据需要遵循算法; (3) 输出语句来跟踪数据和控制流。
  • 如果您只需要解决问题(而不是修复您的特定代码),请进行研究:您正在尝试生成中间元素的所有组合,这个问题在 Stack 上得到了很好的处理溢出和其他地方在线。 “数组元素的所有组合”或“所有子集”应该可以满足您的需求。

标签: java string algorithm


【解决方案1】:

感谢大家的努力。 我意识到解决这个问题的更好方法。 您可以将每个字符串视为二进制数,然后在找到 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");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2018-09-19
    相关资源
    最近更新 更多