目录

一、朴素的模式匹配算法

二、KMP算法(改进的模式匹配算法)


hello!大家好哇,我是灰小猿,一个超会写bug的沙雕程序猿!

今天来和大家分享一个关于字符串比较的模式匹配算法,在数据结构中对字符串的相关操作中,对子串的定位操作通常称为串的模式匹配,同样他也是各种串处理中最重要的操作之一,同时子串也称为模式串,关于主串和模式串的匹配算法常用的主要有两种:朴素的模式匹配算法和KMP算法(改进的模式匹配算法),接下来将分别对这两种算法进行分析。

一、朴素的模式匹配算法

朴素的模式匹配算法也被称为布鲁特—福斯算法,其基本思想是:从主串的第一个字符起与模式串的第一个字符相比较,若相等,则逐一对之后的字符进行比较,否则从主串的第二个字符与模式串的第一个字符重新比较,直到模式串中的每一个字符依次与主串中连续的字符序列相匹配为止,这时就称为匹配成功,如果不能在主串中找到与模式串相匹配的内容,则称为匹配失败。

接下来举一个例子,以字符数组存储字符串,实现朴素的模式匹配算法。

//传入主串s和模式串t,同时设定从主串中开始匹配的位置pos
int index(char s[],char t[],int pos) {int i,j,slen,tlen;i = pos;j = 0;slen = s.length;   //获取到主串的长度tlen = t.length; //获取到模式串的长度while (i<slen && j<tlen) {if (s[i] == t[j]) {i++;j++;}else {i = i-j+1;j=0;}       }if (j>=tlen) {return i-tlen;}return 1;
}

二、KMP算法(改进的模式匹配算法)

KMP算法是上一个算法的改进,相比于朴素的模式匹配算法,KMP算法在进行主串和模式串的匹配过程中,每当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经得到的“部分匹配”结果将模式串向右“滑动”尽可能远的距离,再继续进行比较。

设模式串为“P0...P(m-1)”,KMP匹配算法的思想是:当模式串中的字符Pj与主串中相应的字符Si不相等时,因其前j个字符(“P0...P(j-1)”)已经获得了成功的匹配,所以若模式串中的“P0...P(k-1)”与“P(j-k)...P(j-1)”相同,这时可令P0与Si相比较,从而使i无需回退。

在KMP算法中,依据模式串的next函数值可以实现子串的滑动,若令next[j]=k,则next[j]表示当模式串中的Pj与主串中相应的字符不相等时,令模式串的Pnext[j]与主串的相应字符进行比较,

关于next函数有如下的定义:

以下是求模式串的next函数的程序:

//求模式串p的next函数值,并存入数组next中
void Get_next(char *p,int next[])
{int i,j,slen;slen = strlen(p);    //获取到模式串的长度i=0;while (i<slen) {if (j==-1||p[i]==p[j]) {++i;++j;next[i] = j;} else {j = next[j];}}
}

在获取到的next函数后,

在KMP模式匹配算法中,设模式串的第一个字符下标为0,则KMP算法如下:

/*利用模式串p的next函数,求p在主串s中从第pos个字符开始的位置*/
/*若匹配成功,返回模式串在主串的位置下标,否则返回-1 */
int Index_KMP(char *s,char *p,int pos,int next[])
{int i,j,slen,plen;i=pos-1;j=-1;slen = strlen(s);    //求主串的长度plen = strlen(p);  //求模式串的长度while (i<slen && j<plen) {if (j==-1||s[i]==p[j]) {++i;++j;} else {j=next[j];}}if (j>=plen) {return i-plen;}else {return -1}}

关于字符串模式匹配算法就分享到这里,有不足的地方还希望各位大佬一起指正,

觉得不错记得点赞关注哟!

大灰狼陪你一起进步!

算法案例分析—字符串模式匹配算法相关推荐

  1. 【数据结构】字符串 模式匹配算法的理解与实现 Brute Force算法(BF算法)与KMP算法 (C与C++分别实现)

    #笔记整理 若不了解串的定义,可至: 串(string)的定义与表示 查看 串的模式匹配算法 求子串位置的定位函数 Index(S, P, pos) 求子串的定位操作通常称作串的模式匹配(其中子串P称 ...

  2. Problem C: 算法4-6:KMP字符串模式匹配算法实现

    Problem Description KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置.严蔚敏老师的书中详细描述了KM ...

  3. 数据结构——基于字符串模式匹配算法的病毒感染检测

    实验四 基于字符串模式匹配算法的病毒感染检测 [实验目的] 1.掌握字符串的顺序存储表示方法. 2.掌握字符串模式匹配BF算法和KMP算法的实现. [实验内容] 问题描述 医学研究者最近发现了某些新病 ...

  4. python编程思维代码_Python编程快速上手——强口令检测算法案例分析

    本文实例讲述了Python强口令检测算法.分享给大家供大家参考,具体如下: 强口令检测 题目如下: 写一个函数,它使用正则表达式,确保传入的口令字符串是强口令.强口令定义:长度不少于8个字符,同时包含 ...

  5. 数据据结构实验4《基于字符串模式匹配算法的病毒感染检测》

    (visual studio 2019可运行) 输入及输出要求见<数据结构C语言(第二版)>严蔚敏版 [本文仅用于啥都看不懂还想交作业选手] //KMP求解基于字符串模式匹配算法的病毒感染 ...

  6. MATLAB优化模型例子,MATLAB优化算法案例分析与应用(进阶篇)

    导语 余胜威编著的<MATLAB优化算法案例分析与应用(进阶篇)>基本包括了所有常见的MATLAB优化算法及应用,包括贝叶斯分类器.期望最大化算法.K最近邻密度估计.朴素贝叶斯分类器.背景 ...

  7. KMP算法--字符串模式匹配算法

    今天看到第四章<串>了,其中我觉得花的时间多一点的值得我写篇随笔的知识点就是:4.3 串的模式匹配算法:书上介绍了两种字符串匹配算法,一种是最简单最容易想到的逐个字符匹配算法(时间复杂度在 ...

  8. KMP算法 -- 字符串模式匹配算法

    KMP算法 复杂度O(m+n) 查找某个字符串是否被另一个字符串包含 原理可以见: http://news.cnblogs.com/n/176771/ 代码出自<<大话数据结构>&g ...

  9. 基于字符串模式匹配算法的病毒感染检测问题(KMP算法)

    头文件(tou.h): void get_next(char T[], int next[]);int Index_KMP(char S[], char T[]);void move1(char a[ ...

  10. KMP字符串模式匹配算法【精简代码模板】

    什么是模式匹配 模式匹配(Pattern Matching)就是在一篇长度为n的文本S中,找某个长度为m的关键字P. KMP算法如何来的? KMP算法是由朴素字符串匹配算法优化而来,就是重新利用了朴素 ...

最新文章

  1. 整型数组负数放左面,其他放右面,要求时空复杂度:O(n), O(1)。
  2. python asyncio tcp server_Python 3.4 中新的 asyncio : Servers、Protocols 和 Transports
  3. Windows SharePoint Services 3.0 Step By Step翻译
  4. Spring-注入参数详解-[简化配置方式]
  5. 鸟哥的Linux私房菜(基础篇)-第零章、计算机概论(零.2)
  6. IllegalArgumentException:@Body parameters cannot be used with form or multi-part encoding
  7. 如何在Java中检查对象是否为空?
  8. http的请求体body的几种数据格式
  9. li 字多出了省略号_css 超出用省略号当标题字符溢出用省略号表示
  10. .NET下,你采用的哪种方式来操作数据库
  11. 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
  12. C++图像缩放(StretchBlt,StretchDIBits,双线性内插法)
  13. 随机森林回归预测r语言_R语言 决策树和随机森林 回归分析
  14. 路由协议常见FAQ-V1.1
  15. LVM 的自定义报告(pvs vgs lvs各参数详解)
  16. 电商api、地图api、视频api、音乐api等各类接口合集,或许对你有用
  17. uni app video、视频播放开发
  18. springboot后端数据校验以及异常处理
  19. C语言 强符号与弱符号
  20. 浅析N沟道增强型MOS管双向低频开关电路

热门文章

  1. html5页面分享到微信qq,HTML 分享页面到QQ/微信、微博等平台
  2. 分块矩阵求逆 matlab,矩阵的分块求逆及解线性方程组.doc
  3. International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2018)
  4. java hl7_HL7中文完整版及代码实例
  5. Tmux(-yank,-cssh,-xpanes)使用指南
  6. 小型网络游戏实例(vc++)——网络五子棋
  7. 【JAVA】JSON随机值生成工具类
  8. swiper鼠标经过切换对应轮播图
  9. mysql数据库 uft8_unicode_ci是utf8吗_mysql utf8_unicode_ci与utf8_general_ci的区别
  10. ASP.NET Core WebApi返回结果统一包装实践