我正在努力记住正确的算法,以便在集合中查找与可能子集列表的元素匹配的子集。例如,给定输入:
aehfaqptpzzy
和子集列表:
{ happy, sad, indifferent }
我们可以看到“happy”这个词是匹配的,因为它在输入中:
a e h f a q p t p z z y
我很确定有一个特定的算法可以找到所有这些匹配,但我不记得它叫什么。
的更新 的
上面的例子不是很好,因为它有字母重复,事实上在我的问题中,字典条目和输入字符串都是可排序的集合。例如,
输入:acegimnrqvy
词典: {cgn, DFR, LMR, mnqv, 例如}
因此,在此示例中,算法将返回cgn,mnqv以及例如匹配。此外,我想找到最好的互补比赛,其中“最好”意味着最长。所以,在上面的例子中,“最佳”答案是“cgn mnqv”,例如不匹配,因为它与cgn冲突,这是一个更长的匹配。
我意识到问题可以通过暴力扫描完成,但这是不可取的,因为字典中可能有数千个条目,输入字符串中有数千个值。如果我们试图找到最佳匹配集,可计算性将成为一个问题。
答案 0 :(得分:0)
您可以使用具有多个当前状态的Aho - Corrasick算法。对于每个输入字母,您可以保留(跳过字母)或使用适当的边缘移动。如果两个或多个“演员”在同一个地方相遇,只需将它们合并为一个(如果您只对存在感兴趣而不是计数)。
关于复杂性 - 这可能与天真的O(MN)
方法一样慢,因为最多可以有size of dictionary
个演员。然而,在实践中,我们可以很好地利用这样一个事实,即许多单词是其他单词的子串,因为永远不会超过size of the trie
个演员,与字典的大小相比,往往会要小得多。