【问题标题】:What is the best data structure and algorithm for comparing a list of strings?比较字符串列表的最佳数据结构和算法是什么?
【发布时间】:2010-12-25 09:24:04
【问题描述】:
我想找到符合以下规则的最长的单词序列:
- 每个单词最多只能使用一次
- 所有单词都是字符串
- 如果
sa 的最后两个字符与sb 的前两个字符匹配,则可以连接两个字符串sa 和sb。
在连接的情况下,它是通过重叠这些字符来执行的。例如:
- sa = "都灵"
- sb = "诺瓦拉"
- sa concat sb = "torinovara"
例如,我有以下输入文件,“input.txt”:
诺瓦拉
都灵
维切利
拉文纳
那不勒斯
利弗诺
弥赛亚
纯洁
罗马
而且,上面的文件按照上面的规则输出应该是:
都灵
诺瓦拉
拉文纳
那不勒斯
利沃诺
纯洁
因为可能的最长串联是:
torinovaravennapolivornovilligure
谁能帮我解决这个问题?最好的数据结构是什么?
【问题讨论】:
标签:
c
algorithm
data-structures
directed-graph
digraphs
【解决方案2】:
我会开始很简单。制作 2 个字符串向量,一个按正常排序,一个按最后 2 个字母排序。为第二个向量创建一个索引(整数向量),指出它在第一个向量中的位置。
要找到最长的..首先删除孤儿。两端不匹配的单词。然后你想构建一个 neighbor Joining 树,在这里你可以确定哪些单词可能会相互到达。如果您有 2 棵或更多树,则应先尝试最大的树。
现在对于一棵树,你的工作是找到罕见的末端,并将它们绑定到其他末端,然后重复。这应该会为您提供一个非常好的解决方案,如果它使用您的所有单词,请跳过其他树。如果没有,那么您需要使用大量算法来提高效率。
需要考虑的一些事项:
如果您有 3+ 个独特的结尾,则保证会删除 1+ 个单词。
这可用于在寻找答案时减少您的尝试。
经常重新计算独特的目的。
给定末端的奇数确保必须丢弃一个(末端有 2 个免费赠品)。
隔离可以自我匹配的单词,你总是可以把它们放在最后,否则它们会搞砸数学。
您也许可以创建小的自匹配环,您可以将它们视为自匹配词,只要您在创建它们时不孤立它们。这可以使性能非常出色,但不能保证完美的解决方案。
搜索空间是 order(N!) 数百万个元素的列表可能很难证明确切的答案。当然,我可能会忽略一些东西。