比较字符串列表的最佳数据结构和算法是什么?

时间:2010-12-25 09:24:04

标签: c algorithm data-structures directed-graph digraphs

我想找到符合以下规则的最长字词序列:

  • 每个单词最多可以使用一次
  • 所有单词都是字符串
  • 如果sa的最后两个字符与sb的前两个字符匹配,则可以连接两个字符串sasb

在连接的情况下,通过重叠这些字符来执行。例如:

  • sa =“torino”
  • sb =“novara”
  • sa concat sb =“torinovara”

例如,我有以下输入文件“input.txt”:

  

诺瓦拉

     

托里诺

     

Vercelli的

     

文纳

     

那不勒斯

     

liverno

     

messania

     

诺维利古雷

     

罗姆

并且,根据上述规则输出的上述文件应为:

  

托里诺

     

诺瓦拉

     

文纳

     

那不勒斯

     

窝那

     

诺维利古雷

因为最长的连接是:

torinovaravennapolivornovilligure

任何人都可以帮我解决这个问题吗?什么是最好的数据结构?

2 个答案:

答案 0 :(得分:5)

这可以表示为有向图问题 - 节点是单词,如果它们重叠,它们通过边连接(并且选择最小重叠以获得最长的长度),然后找到最高权重非 - 交叉路径。

(嗯,实际上,你想要稍微扩展一下图形以处理一个单词的开头和结尾。将一个“起始节点”与一个重量长度为/ 2的每个单词的边相邻。 在单词之间,-overlap + length start + length finish / 2,以及每个单词和“结束节点”“length word / 2”之间。可能更容易加倍。)

https://cstheory.stackexchange.com/questions/3684/max-non-overlapping-path-in-weighted-graph

答案 1 :(得分:1)

我会开始很简单。制作2个字符串向量,一个正常排序,一个按最后两个字母排序。为第二个向量创建一个索引(整数向量),指出它在第一个向量中的位置。

要找到最长的..首先删除孤儿。任何一端都不匹配的单词。然后,您希望构建一个邻居加入树,您可以在此确定哪些单词可能相互连接。如果您有2棵或更多树,您应该先尝试最大的树。

现在有了树,你的工作就是找到罕见的目标,并将它们绑定到其他目的,并重复。这应该会给你一个非常好的解决方案,如果它使用你的金色的所有单词,跳过其他树。如果没有那么你可以使用大量算法来提高效率。

要考虑的一些事项: 如果你有3个以上的独特目标,你可以保证丢掉1个以上的单词。     这可以用来在寻找答案时修剪你的尝试。        经常重新计算独特的目的。 给定末端的奇数确保必须丢弃一个(在两端获得2个免费赠品)。 隔离可以自我匹配的单词,你可以随时抛出它们,否则它们会破坏数学运算。 您可以创建小的自匹配环,只要在创建它们时不将它们孤立,就可以将它们视为自匹配单词。这可以使性能变得非常棒,但不能保证完美的解决方案。

搜索空间是订单(N!),数百万个元素的列表可能很难证明确切的答案。当然,我可能会忽略一些事情。