Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一组字符串中查找超级字符串_Java_String_Algorithm_Collections - Fatal编程技术网

Java 在一组字符串中查找超级字符串

Java 在一组字符串中查找超级字符串,java,string,algorithm,collections,Java,String,Algorithm,Collections,我有一个字符串列表,如: cargo cargo pants cargo pants men buy cargo pants men cargo pants men melbourne buy 在这种情况下,包含所有剩余字符串的字符串是cargo buy。我想删除所有较短的字符串,只保留最长的“超级字符串” 注意,如果存在两个查询货裤和货裤,它们将被视为两个不同的查询,并且不会合并 到目前为止,我一直在用蛮力的方式来做这件事——从集合中选取一个字符串,然后遍历同一集合,删除当前字符串的所有其他

我有一个字符串列表,如:

cargo
cargo pants
cargo pants men buy
cargo pants men
cargo pants men melbourne buy
在这种情况下,包含所有剩余字符串的字符串是
cargo buy
。我想删除所有较短的字符串,只保留最长的“超级字符串”

注意,如果存在两个查询
货裤
货裤
,它们将被视为两个不同的查询,并且不会合并

到目前为止,我一直在用蛮力的方式来做这件事——从集合中选取一个字符串,然后遍历同一集合,删除当前字符串的所有其他“子字符串”。大致上

for (String p: big_set) {
    for (String q: big_set) {
        if (!p.equals(q)) {
            if (has_all_words(p, q)) { /* If all words in 'p' is also in 'q' */
                big_set.remove(p);
                break;
            }
        }
    }
}
有没有一种智能算法可以在不到O(n^2)的时间内完成这项工作?在此函数中,
拥有所有单词
在比较时将保留单词的顺序

出于好奇,我有一个包含几十亿个搜索查询(比如发送到Google/Yahoo/Bing的查询)的庞大列表,我正试图为这些查询找到超级名称。有一个服务器解析这个字符串并生成各种有趣的类别。我试图压缩查询列表,希望将计算成本和带宽降到最低。这种方法肯定会显著降低带宽(因为人类不能一次就想到
购买货物
),但预计算成本过高。所以我一直在寻找能够做到这一点的算法,但我还没有发现任何能够做到这一点的算法。

  • 我想你要做的就是删除所有的子字符串 可以在超级字符串中找到,比如[“foo bar“,”foo baz“]您必须存储这两个字符串

  • 如果我的猜测是对的,那么你可以在不到O(n^2)的时间内实现它。 在开始任何短字符串之前,每个超级字符串按字母顺序排列 这样就不会有像货郎买的裤子那样的案子了

  • 首先,根据there将字符串按降序排序
    长度。 然后选取最长字符串的子字符串(正如我们所做的那样
    从第一个索引开始迭代并按相反顺序排序)和
    开始在其余字符串中搜索它

  • 如果找到字符串,请将其删除,并在搜索和删除后删除 只需使用 包含最后一个子字符串的相同超级字符串

  • 最后,您将只剩下唯一的字符串(如果 你认为[ Fo-bar ]、“fo-Baz”是一个唯一的字符串。


“男士墨尔本货裤购买”。包含(“男士货裤购买”)
返回
false
…@Andronicus,但它包含的每一个单词都不是您首先要检查和指定的。我不确定您要实现的目标。如果其中一个查询中有一个单词,但另一个查询中没有,该怎么办?如果您有
[“foo bar”,“foo baz”]
。您的预期输出是什么?@Andronicus-我已经更正了算法以避免混淆。对不起,我的不好。此外,这只是一个粗略的工作。不考虑规模。原始代码是用C编写的,kyotocabinet作为背景集。这里是Java,因为它是一种可爱的语言。