字符串的模式匹配(精准匹配)
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
将模式串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模式匹配算法
字符串的模式匹配(精准匹配)相关推荐
- grep精准匹配字符串
可以精准匹配: ps -ef | grep "\<InspectionState\>" ps -ef | grep -w InspectionState不可以精准匹配: ...
- 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)
字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...
- 字符串的模式匹配(Java实现)
字符串的模式匹配 字串的定位操作通常称做模式匹配,是各种串处理系统中最重要的操作之一.本文主要介绍两种常用的实现算法: 1.暴力匹配 2.KMP算法 1.暴力匹配 时间复杂度为O(n*m):n为主串长 ...
- 字符串多模式精确匹配(脏字/敏感词汇搜索算法)——TTMP算法 之理论(转)...
什么是TTMP算法?不好意思,我发布这篇文章之前,估摸是没有其他地方能找着该算法的,因为那是俺生造的. TTMP是啥意思呢?是Terminator Triggered Multi-Pattern 的 ...
- 字符串的模式匹配方法
String 类型定义了几个用于在字符串中匹配模式的方法.第一个方法就是 match() ,在字符串上调用这个方法,本质上与调用 RegExp 的 exec() 方法相同. match() 方法只接受 ...
- 算法训练二(字符串、模式匹配、堆栈、队列)(含解题思路)(上)
目录 7-1 好前缀 AC代码: 7-2 好后缀 AC代码: 7-3 [模板]KMP字符串匹配 AC代码: 7-5 接话茬 AC代码: 7-6 串的模式匹配 AC代码: 7-7 词频统计 AC代码: ...
- 字符串的最大相似匹配
字符串的最大相似匹配 计划中,kmp完后,本篇继续... 转载于:https://www.cnblogs.com/springmvc-hibernate/archive/2011/12/31/2484 ...
- jquery的contains如何实现精准匹配
一.背景 博主这边的背景是,在一个JS的循环中,要通过匹配option的值来给select下拉框加上默认选中效果.这种涉及到属性匹配的,最适合的就是jquery的contains选择器了.当然,大家也 ...
- 使用js对来判断一个字符串中括号是否平衡匹配
序言:早上起来,按照昨天的计划,看数据结构,上课期间没学习好,这不去公司培训了,发现其重要性,趁做毕业设计的时间好好的学习一些基础知识. 不得不说的是对于软件的童鞋来说,基础仍然是重要的. 不多说,进 ...
- String字符串中获取所有匹配结果的索引值
String字符串中获取所有匹配结果的索引值 例如现在我们有这样一段代码 public interface ActErrorHisMapper {public List<ActError> ...
最新文章
- lightgbm保存模型参数
- python求偶奇数和差编程_选择最大奇数Python
- 启明云端用一张表格带你了解sigmastar SSD20x系列的区别!帮助你快速完成选型!
- XXX管理平台系统——架构
- 讲二次搜索树转化为排序的双向链表
- C 的 3种内存顺序,你都知道吗?
- 2011年三八妇女节搜索引擎LOGO设计欣赏
- 数据库MySQL(课下作业,必做)
- Java语言程序设计(一)选择题
- 苹果Mac桌面Dock中App icon 名称显示乱码怎么办?一个简单指令帮你解决
- Java集合类和HashMap遍历
- 易筋SpringBoot 2.1 | 第十篇:SpringBoot使用thymeleaf入门
- 开关电源matlab仿真文件,基于PI控制方式的7A开关电源的MATLAB仿真.doc
- Python实现词云图的3种方式(词频,一段文本,自定义样式)
- 虚拟机实现远程桌面连接
- FTP 打开文件夹提示该文件没有程序与之关联来执行该操作 请在控制面板的文件夹选项中创建关联
- android 格式化后关机,Android系统为什么用久了会卡?那格式化还原后还会卡吗?...
- 「镁客·请讲」小不点刘筱璇:新制造时代,用3D打印让世界个性起来
- IntellIdea中的jsp中include出现乱码问题
- Linux未来猜想:被遗忘还是终结Windows?
热门文章
- 本周关注我们:节点,流星和网站性能
- DB2中使用事件监控器获取某个时间段里某个用户执行的SQL语句
- 球面两点间的球面距离的计算(2)
- 你了解Android LMK机制么?
- Android 学习(四)——Android Studio 页面跳转
- python实现登录抓取_Python实现爬取需要登录的网站完整示例
- centos7上zabbix3.4详细搭建
- 使用Javascript(js)技术实现动态时钟效果—北大青鸟
- Ubuntu16.04+Titan X+CUDA8.0+cudnn5.1+Caffe
- mysql 8.0.21 对用户授权报错 near ‘IDENTIFIED BY ‘123456‘ with grant option‘ at line 1