在字典中查找匹配项

时间:2016-09-14 00:31:23

标签: regex trie

问题我最近偶然发现并想确认我是否想出了理想的算法: 我需要设计一个基本上包含单词字典的类,然后确定一个模式是否匹配该字典中的一个或多个单词的方法。该模式基本上是正则表达式的一个愚蠢版本,仅支持"。"字符。 该课程有两种方法: void PreProcess(string [] words) bool IsMatch(字符串)

示例:PreProcess(new string [] {" abc"}),然后调用IsMatch(" a.c")将返回true。 我的解决方案大致如下所述。 我最终使用了Trie。我在PreProcess方法中构建了Trie,然后在IsMatch中遍历了trie。当我遇到一个点时,我只是递归迭代当前节点的所有子节点以检查是否有任何匹配。

我的问题是,这个算法的时间复杂度是多少,是否有更好/更有效的解决方案?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果正则表达式中有多个点,您的算法可能会成倍增加。我曾经非常认真地考虑如何将KMP推广到带点或甚至'*'(代表任意数量的任意字符)的键。但似乎KMP根本不起作用,因为两者都是'。' '*'将打破char匹配的传递性,这意味着字符串不同位置的不等字符可以匹配相同的'。'。或键中的'*'。这完全抛弃了KMP的理论。如果KMP不起作用,我看不到特里可以如何工作。

一种肯定有效的算法是尝试将字典中的单词与密钥(正则表达式)逐一匹配。什么时候有'。'在键中,只需跳过并查看下一个字符是否匹配。这个算法看起来很糟糕,但至少它在密钥中的点数上永远不会成倍增长。如果你不能希望达到最好的情况,避免最坏的情况。