我想找到符合以下规则的最长字词序列:
sa
的最后两个字符与sb
的前两个字符匹配,则可以连接两个字符串sa
和sb
。在连接的情况下,通过重叠这些字符来执行。例如:
例如,我有以下输入文件“input.txt”:
诺瓦拉
托里诺
Vercelli的
文纳
那不勒斯
liverno
messania
诺维利古雷
罗姆
并且,根据上述规则输出的上述文件应为:
托里诺
诺瓦拉
文纳
那不勒斯
窝那
诺维利古雷
因为最长的连接是:
torinovaravennapolivornovilligure
任何人都可以帮我解决这个问题吗?什么是最好的数据结构?
答案 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!),数百万个元素的列表可能很难证明确切的答案。当然,我可能会忽略一些事情。