Algorithm 匹配列表中连续子集的算法

Algorithm 匹配列表中连续子集的算法,algorithm,set,subset,string-matching,Algorithm,Set,Subset,String Matching,我试图记住在一个集合中找到一个子集的正确算法,该子集与可能子集列表中的一个元素相匹配。例如,给定输入: aehfaqptpzzy 以及子集列表: { happy, sad, indifferent } 我们可以看到单词“happy”是匹配的,因为它在输入中: aehfaqptpzzy aehfaqptpzy 我很确定有一个特定的算法可以找到所有这样的匹配,但我记不起它叫什么了 更新 上面的例子不是很好,因为它有字母重复,事实上在我的问题中,字典条目和输入字符串都是可排序集。比如说, 输入:

我试图记住在一个集合中找到一个子集的正确算法,该子集与可能子集列表中的一个元素相匹配。例如,给定输入:

aehfaqptpzzy
以及子集列表:

{ happy, sad, indifferent }
我们可以看到单词“happy”是匹配的,因为它在输入中:

aehfaqptpzzy
aehfaqptpzy

我很确定有一个特定的算法可以找到所有这样的匹配,但我记不起它叫什么了

更新

上面的例子不是很好,因为它有字母重复,事实上在我的问题中,字典条目和输入字符串都是可排序集。比如说,

输入:acegimnrqvy

字典: {cgn, dfr, lmr, mnqv, eg}

因此,在本例中,算法将返回cgn、mnqv和eg作为匹配项。此外,我还想找到最佳互补匹配集,其中“最佳”表示最长。因此,在上面的示例中,“最佳”答案是“cgn mnqv”,eg不是匹配项,因为它与cgn冲突,后者是一个较长的匹配项


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

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


关于复杂性-这可能与幼稚的
O(MN)
方法一样慢,因为字典中的参与者可能多达
大小。然而,在实践中,我们可以很好地利用这样一个事实,即许多单词都是其他单词的子字符串,因为trie
参与者的大小永远不会超过
,与字典的大小相比,trie参与者的大小往往要小得多

听起来你真的有一个列表,而不是一套。一个集合没有顺序,也不包含重复项…匹配项在目标字符串中必须是顺序的吗?在这一点上,算法肯定只是简单的从左到右扫描?这将是
O(MN)
(其中
M
是目标单词的数量,
N
是原始列表中的字母数量)。定义“所有此类匹配”。对于输入
ssaadd
,是否应该为
sad
找到6个匹配项?或者你只是想检查一下是否存在sad?这是一个集合。我简化了这个问题。实际问题涉及声学频率设置。例如,声学特征可能是100/51150/30175/35190/17,其中第一个数字是频率,第二个是振幅。问题是要找出声学特征是否存在于环境中的一组音调中。