KMP算法在模式与主串之间存在许多“部分匹配”的情况下,比BF算法快。(注意,接下来的串都是以下标为1作为起始储存位置。)

下面说一下实现代码:

首先是预定义和类型定义:

#define MAXLEN 100

typedef struct{

char ch[MAXLEN + 1];

int length;

}SString;

KMP算法主体函数:

int Index_KMP(SString S, SString T, int pos)

{

int i, j;

int next[MAXLEN + 1];

i = pos;

j = 1;

get_next(T, next);

while (i < T.length)

{

if (j == 0|| S.ch[i] == T.ch[j])

{

++i;

++j;

}

else

j =next[j];

}

if (j >= T.length)

return i -T.length + 1;

else

return 0;

}

先对模式串T的next[]进行取值,具体实现函数get_next()下面给出。将pos的值赋值给i,表示从元素的第pos个值开始对比;让j等于1,表示模式串T从第一个元素开始对比。当j等于0的时候,表示之前没有任何元素相同,且此时i和j都在下一轮该对比的元素的前一位,所以让i和j均加1。当i小于S.length并且j小于T.length的时候,将S.ch[i]和T.ch[j]进行对比,若相等,则对比下一位元素,若不相等,则让j回到模式串T开头和模式串T的j之前匹配的位置。最后当跳出循环的时候,若j的值大于或等于T.length的话,则说明匹配成功,返回该位置;否则表示匹配失败,返回0.

接下来是对结构串的next[]进行取值的函数get_next():

void get_next(SString T, int next[])

{

int i, j;

next[1] = 0;

i = 0;

j = 1;

while (j

{

if (i == 0|| T.ch[i] == T.ch[j])

{

++i;

++j;

next[j]= i;

}

else

i =next[i];

}

}

在看这段代码之前,先理解next[i]的值。个人理解,next[i]记录着开头与当前位置前一位元素匹配的元素的位置。让next[1]=0,在对比过程中,当存在不相等的情况的时候,若此时i=1,则i会等于0,此时模式串T的i,j都在对比元素的前一位,则让i,j都加1,并且让T中下标j的位置指向位置标记为1,回到第一位元素。

加入main()进行测试(注意:写程序的时候建议将KMP主体函数和get_next()函数位置与上面所写的位置对调):

int callen(SString S)

{

int i;

for (i = 0; S.ch[i] !='\n'; i++);

return i;

}

int main(void)

{

SString S, T;

int pos = 1, n, i;

for (i = 1; S.ch[i -1] != '\n'; i++)

{

S.ch[i] =getchar();

}

S.length = callen(S);

fflush(stdin);

for (i = 1; T.ch[i -1] != '\n'; i++)

{

T.ch[i] =getchar();

}

T.length = callen(T);

n = Index_KMP(S, T,pos);

printf("%d\n",n);

return 0;

}

c语言kmp算法代码,C语言KMP算法的实现相关推荐

  1. c语言快速排序算法代码,c语言快速排序算法示例代码分享

    #include #include #include #define RANDOM(i) (rand()%i) #define N 9    //设置数组长度 //分区操作 int Partition ...

  2. C语言雪花算法,记一次雪花算法的实现

    作者最近在实现雪花算法生成主键,看了不少文章.个人觉得雪花算法的最大的优点是有序(减少数据库的页分裂页合并).雪花算法本身很简单,但他依赖于时间,也就是机器或容器的时间一回拨就出现问题了.网上也出现了 ...

  3. javaKMP算法(含KMP算法代码)

    目录 一:应用场景-字符串匹配问题 二:暴力匹配算法 三:KMP 算法介绍 四:KMP 算法最佳应用-字符串匹配问题 字符串匹配问题: 思路分析图解 五:代码展示 一:应用场景-字符串匹配问题 字符串 ...

  4. 06 聚类算法 - 代码案例二 - K-Means算法和Mini Batch K-Means算法比较

    03 聚类算法 - K-means聚类 04 聚类算法 - 代码案例一 - K-means聚类 05 聚类算法 - 二分K-Means.K-Means++.K-Means||.Canopy.Mini ...

  5. 字符串匹配KMP算法设计C语言,KMP字符串匹配算法笔记

    网上有很多解释KMP算法的文章,A_B_C_ABC的这篇很详细,反复看了好几遍,总算理解了个大概,但是总觉得没那么爽快.其实,一种算法各人有各人的理解方法,找到适合自己理解的才容易记住.下面是我对这个 ...

  6. 字符串匹配——KMP算法【C语言】

    KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用匹配失败后 ...

  7. kmp算法的c语言,KMP算法 纯C实现

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我自己写的KMP算法: int nt[256]; void get_next1(char* T, int next[], int tlen) { int  ...

  8. 字体识别c语言,OCR算法之C语言代码 - 源码下载|图形图象|图形/文字识别|源代码 - 源码中国...

    OCR算法代码. 这不是一个完整的系统,没法生成可执行程序. 代码基于Linux/KDE开发,用到了C++标准模板库. 代码的目的是向读者展示一个OCR系统包括哪些部分,如何工作, 读者可以借鉴这些代 ...

  9. 【C++】KMP算法代码实现

    KMP模式匹配算法的实现: 利用KMP模式匹配算法在主串中查找指定模式串.如果主串包含该模式串,则返回该模式串在主串中的序号:否则返回-1. 输入样例: abcddabcababcdaabcababc ...

最新文章

  1. 刷脸取件遭小学生破解,丰巢智能柜紧急下线相关功能
  2. Oracle 10g数据库基础之基本查询语句-中-函数
  3. Oracle 返回结果集 sys_refcursor
  4. Oracle数据库文件恢复与备份思路
  5. 微信公众号每次调用接口正确或错误的返回码
  6. mysql emoji 显示不出来_解决 Mysql 存取 emoji 表情的问题
  7. python3.5以及scrapy,selenium,等 安装
  8. 杭电2078复习时间
  9. angularjs 学习笔记(一) -----JSONP跨站访问
  10. Jquery 中 $('obj').attr('checked',true)失效的几种解决方案
  11. 人人对战五子棋 C++
  12. vsscanf用法解析
  13. Codeforces - Captain Flint and Treasure
  14. Togaf业务架构-《企业级业务架构设计方法论与实践》解读
  15. 岛屿周长c语言,[IOI2008]Island 岛屿
  16. 正确的选择大于努力_选择正确技术的11个注意事项
  17. 家装网线该如何选择?怎么区别好坏
  18. Cacti使用安装详解
  19. 单独按戴尔笔记本f11键和f12键无法调节亮度了怎么办?用(Fn+F11键或者Fn+F12键就好)
  20. 3.1-图像分割引言

热门文章

  1. Python手记-11:PyQuery爬取豆瓣电影评论
  2. 程序设计c语言杨艳丽,2015.04.15数学组:杨艳丽老师公开课:《4.1用字母表示数》...
  3. android滑动自动吸顶效果,安卓当下最流行的吸顶效果的实现(上)
  4. Windows调整桌面鼠标右键文件顺序
  5. tombstones分析方法--转载自CrazyDiode的cnblog
  6. python怎么快速打括号_三分钟,让你弄清楚Python中函数的括号使用
  7. 优化WinXP启动 加速开机时间(转)
  8. 英雄联盟下载官方下载最新版 v3.1.4.4 正式版​
  9. HAWQ技术解析(三) —— 基本架构
  10. 机器学习(十六)——多元正态分布(The multivariate normal distribution)