用于匹配列表中的顺序子集的算法

时间:2014-01-05 10:24:48

标签: algorithm set subset string-matching

我正在努力记住正确的算法,以便在集合中查找与可能子集列表的元素匹配的子集。例如,给定输入:

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冲突,这是一个更长的匹配。

我意识到问题可以通过暴力扫描完成,但这是不可取的,因为字典中可能有数千个条目,输入字符串中有数千个值。如果我们试图找到最佳匹配集,可计算性将成为一个问题。

1 个答案:

答案 0 :(得分:0)

您可以使用具有多个当前状态的Aho - Corrasick算法。对于每个输入字母,您可以保留(跳过字母)或使用适当的边缘移动。如果两个或多个“演员”在同一个地方相遇,只需将它们合并为一个(如果您只对存在感兴趣而不是计数)。

关于复杂性 - 这可能与天真的O(MN)方法一样慢,因为最多可以有size of dictionary个演员。然而,在实践中,我们可以很好地利用这样一个事实,即许多单词是其他单词的子串,因为永远不会超过size of the trie个演员,与字典的大小相比,往往会要小得多。