1.朴素的模式匹配算法

2.字符串的特征向量与KMP模式匹配算法

1.朴素的模式匹配直接贴代码

2.1字符串的的特征向量

例如在目标(target)字符串t中:abcabcabcc

寻找模式(pattern)字符串p:  abcabcc

可见t6与p6不匹配

如果用朴素的匹配思想只需要将模式串一次向右移动一位即可

此时t3-t9与模式串匹配    输出3即可,但是我们去思考一下复杂度

最坏情况就是t9与p6匹配 需要比较多少次呢?观察上面三张图片,每次右移一位就需要比较7次

也就是比较了p.length*(t.length-p.length+1)次        复杂度为O(|T||P|)

这其中有很多不必要的重复操作

第一次比较t6与p6不匹配

观察模式串p自身    p0-p2与p3-p5是一样的都是abc       而第一次不匹配是发生在t6与p6,也就是说第一次比较t0-t5是完全等于p0-p5的

1.模式串p自身p0-p2与p3-p5相等(同为abc)的特性
2.t0-t5 又依次相等与p0-p5
得出p0-p2必然等于t3-t5所以直接比较t6与p3即可

将模式串p直接右移三位。(少了右移一步和右移两步朴素算法当中比较的12次)少了很多重复比较

需要知道的是这是模式串自身的特性,所以我们不再考虑目标串。

在模式P与目标T的匹配过程中,当某次比较出现Pi≠Tj时意味着在此前的匹配历史中有下述匹配的子串满足P(0.....i-1)=T(j-i....j-1)相等,如果P(0....i-2)=P(1....i-1)成立,即表示模式右移一位后,P(0....i-2)与T(j-i+1...j-1)必下相等。所以此时直接比较Pi-1和Tj即可。由此可知,利用之前的比较结果减少了在目标串上的回溯。若P(0....i-2)=P(1....i-1)不成立,则可以继续查看P(0....i-3)与P(2....i-1)是否相等,若相等,则将模式右移两位,因为此时P(0....i-3)与T(j-i+2....j-1)必然相等。依次类推,必然可以找到某个K值,使得P(0....i-k-1)=P(k....i-1)成立,此时把模式右移K位开始下一次匹配,既不会丢失配串,又不会产生目标回溯的情况。                                                     字符串的特征数Ni是递归定义的

1)N0=0,对于i>0的Ni,假定已知前一个字符的特征数N(i-1)=K;

2)如果i>0且Qi=Qk 则Ni=K+1;

3)当Qi≠Qk 且K≠0时,令K=N(K-1),并让(3)循环到条件不满足;

4)当Qi≠Qk,且K=0时,则Ni=0;

给出计算模式串特征向量的算法

KMP模式匹配算法

字符串的模式匹配(精准匹配)相关推荐

  1. grep精准匹配字符串

    可以精准匹配: ps -ef | grep "\<InspectionState\>" ps -ef | grep -w InspectionState不可以精准匹配: ...

  2. 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)

    字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...

  3. 字符串的模式匹配(Java实现)

    字符串的模式匹配 字串的定位操作通常称做模式匹配,是各种串处理系统中最重要的操作之一.本文主要介绍两种常用的实现算法: 1.暴力匹配 2.KMP算法 1.暴力匹配 时间复杂度为O(n*m):n为主串长 ...

  4. 字符串多模式精确匹配(脏字/敏感词汇搜索算法)——TTMP算法 之理论(转)...

    什么是TTMP算法?不好意思,我发布这篇文章之前,估摸是没有其他地方能找着该算法的,因为那是俺生造的.  TTMP是啥意思呢?是Terminator Triggered Multi-Pattern 的 ...

  5. 字符串的模式匹配方法

    String 类型定义了几个用于在字符串中匹配模式的方法.第一个方法就是 match() ,在字符串上调用这个方法,本质上与调用 RegExp 的 exec() 方法相同. match() 方法只接受 ...

  6. 算法训练二(字符串、模式匹配、堆栈、队列)(含解题思路)(上)

    目录 7-1 好前缀 AC代码: 7-2 好后缀 AC代码: 7-3 [模板]KMP字符串匹配 AC代码: 7-5 接话茬 AC代码: 7-6 串的模式匹配 AC代码: 7-7 词频统计 AC代码: ...

  7. 字符串的最大相似匹配

    字符串的最大相似匹配 计划中,kmp完后,本篇继续... 转载于:https://www.cnblogs.com/springmvc-hibernate/archive/2011/12/31/2484 ...

  8. jquery的contains如何实现精准匹配

    一.背景 博主这边的背景是,在一个JS的循环中,要通过匹配option的值来给select下拉框加上默认选中效果.这种涉及到属性匹配的,最适合的就是jquery的contains选择器了.当然,大家也 ...

  9. 使用js对来判断一个字符串中括号是否平衡匹配

    序言:早上起来,按照昨天的计划,看数据结构,上课期间没学习好,这不去公司培训了,发现其重要性,趁做毕业设计的时间好好的学习一些基础知识. 不得不说的是对于软件的童鞋来说,基础仍然是重要的. 不多说,进 ...

  10. String字符串中获取所有匹配结果的索引值

    String字符串中获取所有匹配结果的索引值 例如现在我们有这样一段代码 public interface ActErrorHisMapper {public List<ActError> ...

最新文章

  1. lightgbm保存模型参数
  2. python求偶奇数和差编程_选择最大奇数Python
  3. 启明云端用一张表格带你了解sigmastar SSD20x系列的区别!帮助你快速完成选型!
  4. XXX管理平台系统——架构
  5. 讲二次搜索树转化为排序的双向链表
  6. C 的 3种内存顺序,你都知道吗?
  7. 2011年三八妇女节搜索引擎LOGO设计欣赏
  8. 数据库MySQL(课下作业,必做)
  9. Java语言程序设计(一)选择题
  10. 苹果Mac桌面Dock中App icon 名称显示乱码怎么办?一个简单指令帮你解决
  11. Java集合类和HashMap遍历
  12. 易筋SpringBoot 2.1 | 第十篇:SpringBoot使用thymeleaf入门
  13. 开关电源matlab仿真文件,基于PI控制方式的7A开关电源的MATLAB仿真.doc
  14. Python实现词云图的3种方式(词频,一段文本,自定义样式)
  15. 虚拟机实现远程桌面连接
  16. FTP 打开文件夹提示该文件没有程序与之关联来执行该操作 请在控制面板的文件夹选项中创建关联
  17. android 格式化后关机,Android系统为什么用久了会卡?那格式化还原后还会卡吗?...
  18. 「镁客·请讲」小不点刘筱璇:新制造时代,用3D打印让世界个性起来
  19. IntellIdea中的jsp中include出现乱码问题
  20. Linux未来猜想:被遗忘还是终结Windows?

热门文章

  1. 本周关注我们:节点,流星和网站性能
  2. DB2中使用事件监控器获取某个时间段里某个用户执行的SQL语句
  3. 球面两点间的球面距离的计算(2)
  4. 你了解Android LMK机制么?
  5. Android 学习(四)——Android Studio 页面跳转
  6. python实现登录抓取_Python实现爬取需要登录的网站完整示例
  7. centos7上zabbix3.4详细搭建
  8. 使用Javascript(js)技术实现动态时钟效果—北大青鸟
  9. Ubuntu16.04+Titan X+CUDA8.0+cudnn5.1+Caffe
  10. mysql 8.0.21 对用户授权报错 near ‘IDENTIFIED BY ‘123456‘ with grant option‘ at line 1