首先我们看一下简单的字符串匹配.

你可以把文本字符串s固定,模式字符串p从s对齐的左边缘,作为承担部分完全一致,匹配成功,失败将是模式字符串p整体向右1地点,继续检查对齐部分,重复.

#朴素匹配
def naive_match(s, p):m = len(s); n = len(p)for i in range(m-n+1):#起始指针iif s[i:i+n] == p:return Truereturn False

关于kmp算法,讲的最好的当属阮一峰的<字符串匹配的KMP算法>.一路读下来,豁然开朗.
事实上就是,对模式串p进行预处理,得到前后缀的部分匹配表,使得我们能够借助已知信息,算出能够右移多少位.即 kmp = 朴素匹配 + 移动多位.
很多其它细节请看阮一峰的文章,这里就不展开了.
以下给出python的代码实现.

#KMP
def kmp_match(s, p):m = len(s); n = len(p)cur = 0#起始指针curtable = partial_table(p)while cur<=m-n:for i in range(n):if s[i+cur]!=p[i]:cur += max(i - table[i-1], 1)#有了部分匹配表,我们不仅仅是单纯的1位1位往右移,能够一次移动多位breakelse:return Truereturn False#部分匹配表
def partial_table(p):'''partial_table("ABCDABD") -> [0, 0, 0, 0, 1, 2, 0]'''prefix = set()postfix = set()ret = [0]for i in range(1,len(p)):prefix.add(p[:i])postfix = {p[j:i+1] for j in range(1,i+1)}ret.append(len((prefix&postfix or {''}).pop()))return retprint naive_match("BBC ABCDAB ABCDABCDABDE", "ABCDABD")
print partial_table("ABCDABD")
print kmp_match("BBC ABCDAB ABCDABCDABDE", "ABCDABD")

版权声明:本文博客原创文章,博客,未经同意,不得转载。

流动python - 字符串KMP匹配相关推荐

  1. Python字符串模糊匹配库FuzzyWuzzy

    Python字符串模糊匹配库FuzzyWuzzy 在计算机科学中,字符串模糊匹配(fuzzy string matching)是一种近似地(而不是精确地)查找与模式匹配的字符串的技术.换句话说,字符串 ...

  2. python字符串模糊匹配 - FuzzyWuzzy

    简介 字符串模糊匹配在很多问题中有实际价值.比如NER或任何词条关联问题,将不规范的词条与标准词条进行链接匹配.在数据量大或包含关系复杂时,使用优秀的工具包可极大提升效率. FuzzyWuzzy 既是 ...

  3. python字符串模糊匹配 - RapidFuzz

    简介 之前已介绍了字符串模糊匹配的应用以及FuzzyWuzzy包的使用.目前使用较多的是运行速度更快的RapidFuzz,从名字即可看出其特点.RapidFuzz是一个使用python和C++编写的字 ...

  4. python字符串模糊匹配_NLP教程:用Fuzzywuzzy进行字符串模糊匹配

    在计算机科学中,字符串模糊匹配( fuzzy string matching)是一种近似地(而不是精确地)查找与模式匹配的字符串的技术.换句话说,字符串模糊匹配是一种搜索,即使用户拼错单词或只输入部分 ...

  5. python 求子字符串_(6)KMP算法(求子串的位置)______字符串的匹配

    问题: 已知字符串 B 是字符串 A 的一个子串,问字符串 B 在字符串 A 的第一次出现位置. 暴力方法:从 A 字符串 的每个位置开始对字符串 B 进行匹配. 这种方法根据数据的不同 复杂度不同最 ...

  6. python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串

    一.trie树应用: 相应leetcode 常用于搜索提示,如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 例如三个单词app, apple, add ...

  7. KMP经典算法与变形的应用(字符串parttern匹配问题)

    KMP经典算法与变形的应用(字符串parttern匹配问题) 1. 问题描述 求主串字符串a是否含有模式串字符串parttern b,也就是匹配问题经典KMP算法是计算next[j]数组,然后每次移动 ...

  8. python模糊查询_python实现字符串模糊匹配

    之前笔者写过一篇文章关于如何做搜索,但那篇文章的角度是从文本相似度角度写的.那种方式是目前发展的趋势,但是真正的搜索特别是网页搜索不可能在大范围的文本之间两两算相似度的.那样搜索引擎的效率会变得特别低 ...

  9. python字符串与文本处理技巧(1):分割、首尾匹配、模式搜索、匹配替换

    1. 字符串分割 将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的. str.split() 和 re.split() string 对象的 split() 方法只适应于非常简单的 ...

最新文章

  1. 跨时钟域处理——脉冲同步器
  2. E431 笔记本电池问题 0190 Critical low-battery error 解决办法
  3. 数据库sql linux,linux安装mysql数据库
  4. python requests
  5. php请编写一个函数来将一个_为什么开发人员讨厌PHP
  6. Kubernetes入门——Kubernetes工作原理及使用
  7. 求实数的绝对值。_例谈六种有关绝对值问题的解题方法
  8. 使用Java操作文本文件的方法详解
  9. [原] XAF How to implement a custom attribute to customize the Application Model
  10. 怎么用js动态 设置select中的某个值为选中项
  11. 【今日CV 视觉论文速览】 07 Dec 2018
  12. killall 引起应用程序挂起【原创】
  13. CVE-2021-30116: Kaseya VSA 远程代码执行漏洞
  14. linux下截图软件 shutter
  15. 毕业设计 - - -数码交流论坛项目功能分析(暂时
  16. 郭盛华与米特尼克,中美两大顶尖电脑高手,两人竟有太多相似之处
  17. ttest求pvalue_关于ttest里的P值
  18. ad17编辑界面怎么检查未连线_EZCast“未发现装置,请检查网路连线状态”解决办法是什么?EZCast提示“未发现装置,请检查网路连线状态”如何解决?...
  19. 【MySql】MySQL排序分页查询数据顺序错乱的原因和解决办法
  20. houdini 求出曲线的法向 切线以及副法线

热门文章

  1. 谈谈java并发锁(重入锁、读写锁、公平锁)
  2. 数据库系统概念总结:第七章 数据库设计和E-R模型
  3. android11开启无线调试
  4. Cisco Packet Tracer7.0的安装汉化与使用
  5. python中set怎么循环_python如何遍历set
  6. 视频 + PPT | 财富管理转型,券商如何精细化运营?
  7. IBM 火雪挺:人工智能如何影响衣食住行?
  8. 初识大数据(三. Hadoop与MPP数据仓库)
  9. react - antd (Table 与 Cascader 平级数据转树形实操)
  10. 安装Discuz!论坛