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

C 比较字符串列表的最佳数据结构和算法是什么?,c,algorithm,data-structures,directed-graph,digraphs,C,Algorithm,Data Structures,Directed Graph,Digraphs,我想找到符合以下规则的最长单词序列: 每个单词最多只能使用一次 所有的单词都是字符串 如果sa的最后两个字符与sb的前两个字符匹配,则可以连接两个字符串sa和sb 在串联的情况下,通过重叠这些字符来执行。例如: sa=“都灵” sb=“诺瓦拉” sa concat sb=“托里诺瓦拉” 例如,我有以下输入文件“input.txt”: 诺瓦拉 都灵 维切利 拉文纳 那不勒斯 利弗诺 梅萨尼亚 小说 罗马 并且,根据上述规则,上述文件的输出应为: 都灵 诺瓦拉 拉文纳 那不勒斯 利沃诺 小说

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

  • 每个单词最多只能使用一次
  • 所有的单词都是字符串
  • 如果
    sa
    的最后两个字符与
    sb
    的前两个字符匹配,则可以连接两个字符串
    sa
    sb
在串联的情况下,通过重叠这些字符来执行。例如:

  • sa=“都灵”
  • sb=“诺瓦拉”
  • sa concat sb=“托里诺瓦拉”
例如,我有以下输入文件“input.txt”:

诺瓦拉

都灵

维切利

拉文纳

那不勒斯

利弗诺

梅萨尼亚

小说

罗马

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

都灵

诺瓦拉

拉文纳

那不勒斯

利沃诺

小说

因为最长的可能连接是:

torinovaravennapolivornovilligure

有谁能帮我解决这个问题吗?最佳的数据结构是什么?

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

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


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

寻找最长的。。首先,把孤儿带走。两端都不匹配的单词。然后你想建立一个邻居连接树,在这里你可以确定哪些单词可以互相连接。如果你有两棵或更多的树,你应该先尝试最大的树

现在有了一棵树,你的工作就是找到稀有的一端,把它们绑在另一端,然后重复。这将为您提供一个非常好的解决方案,如果它使用了所有的单词yourgold,那么跳过其他树。如果没有,那么您的应用程序将集成一系列算法,以提高效率

应考虑的一些项目: 如果你有3个以上独特的结尾,你保证会删除1个以上的单词。 在寻找答案时,这可以用来减少尝试次数。 经常重新计算唯一的端点。 给定端的奇数确保必须删除一个(在端部可以获得2个免费赠品)。 把能自我匹配的单词分开,你可以把它们放在最后,否则它们会把数学搞砸。 你可以创建小的自匹配环,你可以像对待自匹配词一样对待这些环,只要你在创建它们时不使它们孤立。这可以使性能非常出色,但不能保证有一个完美的解决方案

搜索空间是有序的(N!)数百万个元素的列表可能很难证明准确答案。当然,我可能忽略了一些东西