所有字符串匹配算法的核心问题是,当出现不匹配时,如何向后移动模式串

一、暴力匹配算法

如果要匹配一个字符串s 和一个模式串p,则从i=0开始依次匹配s[i:(i+len(p))],简单粗暴,代码如下:

def matcher(t, p):
# param t: the string to check
# param p: pattern
n = len(t)
m = len(p)
for i in xrange(0, n-m+1):
if p == t[i:i+m]: return True

二、KMP算法

参见:http://blog.csdn.net/v_july_v/article/details/7041827

简单来说,就是当匹配字符串s和模式串p时,当s[i]和p[j]不匹配时,不回溯S,而是将p右移一定位数开始匹配。所右移位数由以下规则确定:若p[j]前面的字符串最大长度的前后缀相同的字符串长度为L, 则右移(已匹配字符串长度—L),文字描述比较抽象,参见上面博客内容

def pmt(s):
"""
PartialMatchTable
""" prefix = [s[:i+1] for i in range(len(s)-1)]
postfix = [s[i+1]: for i in range(len(s)-1)]
intersection = list(set(prefix) & set(postfix)) # 得到相同前后缀
if intersection:
return len(intersection[0]) # 得到最长前后缀
return o def kmp(t, p):
# t: the string to check
# p: pattern
i = 0
while i < len(t) - len(p) + 1:
match = True
for j in range(len(p)):
if t[i+j] != p[j]:
match = False
break
if match:
return True
# kmp
if j:
i += j - pmt(p[:j])
else: i += 1
return False

以上代码参考http://cnblogs.com/goodspeed/p/3295456.html

另外,还有BM算法,sunday算法以及horspool算法,后两种是迁移中的变种,“BM算法在实际应用中比KMP算法快三到五倍”。

最新文章

  1. 上海有线通下载exe会302转发请求
  2. KnockoutJS 3.X API 第一章 简介
  3. PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入
  4. [Effective Java]第七章 方法
  5. DDD理论学习系列——案例及目录
  6. 高质量的内容是SEO的关键
  7. The walking dead
  8. vue keep-alive 实现详情返回列表保留页面数据
  9. HTTP 403 ,tomcat配置HTTPS,无法访问 返回状态码HTTP 403
  10. Javascript高级编程学习笔记(14)—— 引用类型(3)Date类型
  11. Link-Cut Tree(LCT)&amp;TopTree讲解
  12. 【Ruby】【YAML】
  13. MVC扩展之HtmlHelper辅助方法
  14. canvas 实现微信小游戏
  15. 第10月第13天 xcode ipa
  16. 转 redis 锁
  17. 使用pidstat监控资源使用
  18. sql语句中出现笛卡尔乘积 SQL查询入门篇
  19. cocos2d-x树结构执行动作
  20. zabbix server监控报主机 Lack of free swap space

热门文章

  1. spring4使用websocket
  2. localtunnel.me 原理流程浅析
  3. RHCA学习笔记:RH442-Unit5 队列原理
  4. linux启动的过程
  5. Windows redis集群搭建
  6. 参加魅族 flyme 互联网编程大赛的一些感受
  7. 搭建用友开发环境(基于碧桂园的nchome)
  8. windows下Nginx配置与测试
  9. 深入理解Java的接口和抽象类 _摘抄
  10. 访问权限PPP(public、private、protected、default)之成员变量、成员变量权限解析