当前位置: 首页 > 面试题库 >

高效的字符串匹配算法

汤承德
2023-03-14
问题内容

我正在尝试建立一种有效的字符串匹配算法。这将在大容量环境中执行,因此性能至关重要。

这是我的要求:

  • 给定一个域名,即www.example.com,确定它是否与条目列表中的一个“匹配”。
  • 条目可能是绝对匹配项,即www.example.com。
  • 条目可能包含通配符,即* .example.com。
  • 通配符条目从最定义的级别开始向上匹配。例如,*。example.com将与www.example.com,example.com和sub.www.example.com匹配。
  • 通配符条目未嵌入,即sub。*。example.com将不是条目。

语言/环境:C#(.Net Framework 3.5)

我考虑过将条目(和域查找)拆分为数组,颠倒顺序,然后遍历数组。虽然准确,但感觉很慢。

我考虑过正则表达式,但担心将条目列表准确地表示为正则表达式

我的问题:给定上面列出的说明,一种有效的方式来查找域名形式的字符串是否与字符串列表中的任何一个匹配?


问题答案:

如果您想自己动手,我会将条目存储在树形结构中。

而不是通过“”标记该结构。字符,我只会将每个条目视为完整字符串。任何标记化的实现仍然仍然必须对整个字符集进行字符串匹配,因此您也可以一次性完成所有操作。

它和常规拼写检查树之间的唯一区别是:

  1. 匹配需要反向进行
  2. 您必须考虑通配符

要解决第2点,您只需在测试结束时检查“ *”字符。

一个简单的例子:

参赛作品:

*.fark.com
www.cnn.com

树:

m -> o -> c -> . -> k -> r -> a -> f -> . -> *
                \
                 -> n -> n -> c -> . -> w -> w -> w

检查www.blog.fark.com将涉及到从树到第一个树的跟踪"*"。由于遍历以结束"*",因此存在匹配项。

检查www.cern.com将在n,n,c,…的第二个“ n”上失败。

由于遍历以以外的其他字符结束,因此检查dev.www.cnn.com也会失败"*"



 类似资料:
  • 问题 你想要匹配两个或多个字符串。 解决方案 计算把一个字符串转换成另一个字符串所需的编辑距离或操作数。 levenshtein = (str1, str2) -> l1 = str1.length l2 = str2.length prevDist = [0..l2] nextDist = [0..l2] for i in [1..l1] by 1

  • 本文向大家介绍Python实现字符串匹配的KMP算法,包括了Python实现字符串匹配的KMP算法的使用技巧和注意事项,需要的朋友参考一下 kmp算法 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达

  • 本文向大家介绍Python字符串匹配算法KMP实例,包括了Python字符串匹配算法KMP实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python字符串匹配算法KMP。分享给大家供大家参考。具体如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 本文向大家介绍计算一对Java字符串中匹配字符的数量,包括了计算一对Java字符串中匹配字符的数量的使用技巧和注意事项,需要的朋友参考一下 为了找到两个Java字符串中匹配字符的数量,方法是首先创建两个字符串的字符数组,使比较变得简单,然后将每个唯一字符放入Hash映射中。 将其他字符串的每个字符与创建的哈希映射进行比较,以防万一(如果存在的话)将该字符放入其他哈希映射中以防止重复。最后获取此新创

  • 问题内容: 我有一个字符串,其中单词“ LOCAL”多次出现。我使用该函数搜索该单词,但它也返回另一个单词“ Locally”。我如何准确匹配“本地”一词? 问题答案: 对于这种事情,正则表达式非常有用: \ b基本上表示单词边界。可以是空格,标点符号等。 编辑评论: 显然,如果您不想忽略这种情况,则可以删除flags = re.IGNORECASE。

  • 我正在尝试创建一个Lucene4.10索引。我只想在索引中保存我放入文档的确切字符串,witout标记化。 我在用StandardAnalyzer。 我试图搜索术语“燃料箱容量”@en(包括引号),所以我试图省略它们,并在术语周围添加了另外几个引号,以便让lucene理解我正在搜索整个文本。 如果我打印查询,我会得到:3:“燃料箱容量en”,但我不想拆分@符号上的文本。 我认为我的第一个问题是St

  • 本文向大家介绍C语言实现字符串匹配KMP算法,包括了C语言实现字符串匹配KMP算法的使用技巧和注意事项,需要的朋友参考一下 字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 下面的的KMP算法的解释步骤 1. 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符

  • 本文向大家介绍字符串的模式匹配详解--BF算法与KMP算法,包括了字符串的模式匹配详解--BF算法与KMP算法的使用技巧和注意事项,需要的朋友参考一下 一.BF算法     BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后