因此,我们有一组多个字符串,并希望使用最佳算法来检查是否可以在输入文本中找到任何字符串。重要的是我们对找到所有匹配的字符串不感兴趣,只需找到一个就足够了。
我发现了这个:http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm它似乎非常好,但它找到了所有匹配的模式。如果我们不需要额外的信息,有没有办法让事情变得更快?
当然,我们可以在找到第一个匹配模式时终止Aho Corasick算法,但是还有另一种方法可以更快地解决这类问题吗?
答案 0 :(得分:1)
你不能多更低,因为复杂性
算法的复杂性在模式的长度加上搜索文本的长度加上输出匹配的数量是线性的。
显然,你必须仔细检查每个模式和文本。
唯一要减少的是输出匹配的数量。但这很简单。在原始算法中,一旦满足接受状态,它就输出与之匹配的所有字典项。对于您的变体,只需将接受状态标记为接受并输出一些"接受"符号",或在构造FSM时任意选择一个字典项并输出。
答案 1 :(得分:-2)
只需构建一个正则表达式,让您的编程语言库为您完成艰苦的工作和优化。我最近在C#中写道:http://rextester.com/WFQNET2876