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,因为它是一种可爱的语言。