查找与子字符串列表匹配的行

时间:2013-01-31 05:36:19

标签: string algorithm search

这是一个面试问题。

我有一个带有网址的文本文件,例如:

www.yahoo.com
www.google.com
www.apple.com
www.microsoft.com

我有一个子串列表,例如oo,goog,app。如何找到与其中一个子串匹配的所有行?对于这个例子,我会:

www.yahoo.com
www.google.com
www.apple.com

面试官不喜欢一行一行地检查是否有任何子串出现在一条线上。然后我说我们可以使用trie,但只有当子串的第一个字符与行中的第一个字符匹配时才有用,这与建议功能在Google中的工作方式类似。

由于

1 个答案:

答案 0 :(得分:2)

您可以使用正则表达式。例如,表达式oo|goog|app就可以了。

如果您有大量的子字符串并且要搜索大量文本,则可以使用Aho-Corasick string matching algorithm之类的内容。

有趣的是,蛮力方法(使用标准字符串匹配算法)和Aho-Corasick算法将为“www.google.com”(“oo”和“goog”)输出两个匹配项,但是正则表达式解决方案只输出一个。

关于你对问题是否合适的评论,它可能不是为了得到一个“正确”的答案,而是为了看你如何看待问题。例如,使用标准字符串搜索算法将花费与MxN成比例的时间,其中M是要搜索的字符串的数量,N是要查找的子字符串的数量。正则表达式解决方案会更快,因为您只需要在正在搜索的每个字符串上运行一次正则表达式。 Aho-Corasick算法更快,因为它的状态机在一次传递中找到所有匹配。您使用的方法取决于许多因素,包括您拥有多少字符串和子字符串,运行此频率的频率以及实施解决方案所需的时间。这是一个很好的问题,可以揭示您如何处理难题以及如何识别和评估潜在的解决方案。

相关问题