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

String 查找与子字符串列表匹配的行,string,algorithm,search,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,但这只有在子字符串的第一个字符与行中的第一个字符

这是一个面试问题

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

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,但这只有在子字符串的第一个字符与行中的第一个字符匹配时才有用,这类似于谷歌的建议功能


谢谢

您可以使用正则表达式。例如,表达式
oo | goog | app
就可以做到这一点

如果您有大量的子字符串,并且要搜索大量的文本,那么您可以使用类似的方法

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


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

trie是愚蠢的。可以使用已知的字符串匹配算法,如Boyer Moore或regex。也可以使用KMP进行字符串匹配。我没想到会使用这些“命名”算法。我想我可以当场找到解决办法。是的,这里发布的算法是用简单的结构发明的,但不太可能有人在面试时想到它们。如果面试官希望我使用Boyer Moore、KMP等,我认为这不是一个好问题。这是我第一次听说这些算法。让我看看。我不确定面试官是否喜欢使用正则表达式,因为他们通常希望你想出一些不需要额外工具的东西,比如grep。