对于一个串中某个子串的定位操作称为串的模式匹配,其中待定的子串称为模式串。算法的基本思想:从主串的第一个位置起和模式串的第一个字符开始比较,如果想等,则继续逐一比较后续字符;否则从主串的第二个字符开始,在重新用上一步的方法与模式串中的字符比较,以此类推,知道比较完模式串的所有字符。若匹配成功,则返回模式串在主串中的位置;若匹配不成功,则返回一个可区别与主串所有位置的标记,如“-1”,这是最简单的模式匹配,暴力枚举。

上面是一个简单的模式匹配,优点是容易理解,实现简单;缺点也很明显:效率不高。

从简单模式匹配算法可以看两点重要信息:1.标记i在主串中的位置基本反映了算法完成的进度,i走的越快,或者说i回溯的距离越小,算法执行就越快。2.通过i和j的回溯,是的下一趟尽可能消除当前位置的不匹配,进而使i继续往前走。由此,容易看出提升效率的一个可能的突破点:不回溯i,想办法通过调整j的位置消除i的不匹配。

定义一个整型数组next[],next[n]中保存了模式串下标n处发生不匹配时,主串应当从模式串下标k处的字符开始比较,即next[n] = k;

由于最近比较忙,对于具体算法推导就先不写了,有空会补齐,整个推导的过程。

下面是KMP的一个简单实现,虽然求解next数组的方法不是一种高效的方法,但却更便于手工推导。

#include <stdio.h>
#include <string.h>int  KMP(char str[], char subStr[], int next[])
{int i = 0, j = 0;while(i < strlen(str) && j < strlen(subStr)){if(str[i] == subStr[j]){++i;++j;}else{j = next[j];if(j == -1){j = 0;++i;}}}if(j == strlen(subStr))return i - strlen(subStr);elsereturn -1;
}void getNext(char subStr[], int next[])
{int i = 0, j = -1;next[0] = j;while(i < strlen(subStr)){if(j == -1 || subStr[i] == subStr[j]){++i;++j;next[i] = j;}elsej = next[j];}
}int main()
{char str[100], subStr[50];int next[50] = {0};scanf("%s", str);   ///主串 scanf("%s", subStr);     ///模式串 getNext(subStr, next);for(int i=0; i < strlen(subStr); i++) ///输出next数组的值 {printf("%d   ", next[i]);}printf("\n");int pos = KMP(str, subStr, next);printf("%d\n", pos);return 0;
}

经典算法——KMP模式匹配相关推荐

  1. 经典算法题每日演练——第七题 KMP算法

    原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...

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

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

  3. 算法:模式匹配之KMP算法

    前言: 昨天看到<算法导论>里的第32章:字符串匹配,说到一个关于字符串匹配的很好的算法--KMP.关于KMP的内存含意以及KMP的来源,不是本文讲述的范畴,请感兴趣的读者自行查阅相关资料 ...

  4. 字符串的模式匹配--BF算法KMP算法

    BF算法是基于主串指针回溯,重新与子串进行逐字符进行比较,主串为S什么要进行回溯呢,原因在于模式P中存在相同的字符或者说由字符(串)存在重复(模式的部分匹配性质),设想如果模式P中字符各不相同,主串就 ...

  5. KMP算法字符串模式匹配

    KMP字符串模式匹配详解 来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算 ...

  6. 模式匹配(Java)——烤馍片算法(KMP算法)

    模式匹配(Java) 模式匹配 模式匹配是数据结构中字符串的一种基本运算. 由于字符串我们学习过了,大部分操作都比较清楚,但是模式匹配相对来说操作稍微有些难度,所以我们在这里简单的进行讲述. 模式匹配 ...

  7. 前端笔试常考设计模式,操作系统,数据结构,ACM模板,经典算法,正则表达式,常用方法

    考试时允许使用草稿纸,请提前准备纸笔.考试过程中允许上厕所等短暂离开,但请控制离开时间 笔试得分60%一般通过,面试答对80%才能通过 合集:2023年最全前端面试题考点HTML5+CSS3+JS+V ...

  8. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  9. 数据结构经典算法集锦

    数据结构经典算法集锦 第2章 线性表 KMP算法 //获得next数组 void GetNext(char *t, int next[MAX]) {int i = 1, j = 0;next[1] = ...

最新文章

  1. CodeIgniter开发实际案例-新闻网站【转】
  2. 【Android 应用开发】Android 图表绘制 achartengine 示例解析
  3. MultiProcess-MultiThread
  4. 在大数据圈你不知道的15个新技术
  5. 【python】Macbook的Anaconda查看、创建和管理python环境
  6. 博文视点大咖直播伴你读No.4:用户增长、产品思维和产品的变化
  7. 野村综合研究所李智慧:日本金融科技是制度先行而非技术先行
  8. npm和yarn科学设置淘宝镜像
  9. web项目设计文档_web项目前后端分离模式下的权限设计方案
  10. c语言打印图形 原理,C语言打印各种图形
  11. 决策树模型实现冬小麦提取
  12. [论文笔记] 视频广告理解的多模态框架
  13. 数据结构——哈夫曼树及其应用
  14. backdrop-filter,让你的网站熠熠生”毛’
  15. VSCode中出现未定义标识符,可以找到引用但是依旧标红
  16. vt-x+linux子系统,虚拟机安装linux 系统(二 )解决 Intel VT-x 报错
  17. C语言 模拟简单的地铁售票系统
  18. win10解决桌面图标变白
  19. Android 开发摆脱数据线 - Android studio 无线调试App
  20. NullPointerException 没有堆栈

热门文章

  1. 干货下载 | 评估产品增长,勿陷入“土著思维”
  2. 数据驱动才是零售企业转型的核心!
  3. 区块链开发_以太坊多重签名
  4. Swagger生成的接口需要权限验证的处理方法
  5. linux inode100%
  6. 睡前一分钟打造完美下半身 - 健康程序员,至尚生活!
  7. C++返回栈上的数组(局部变量)问题探索
  8. C# == equals 本质理解
  9. mysql 合并left join 数据条目
  10. cloudstack centOS安装(一)