博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串匹配:KMP算法
阅读量:6924 次
发布时间:2019-06-27

本文共 1510 字,大约阅读时间需要 5 分钟。

一、原理:

  KMP算法是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。朴素算法(即暴力循环)的效率太差,因为它没有好好利用比较时产生的信息,而KMP算法则运用了这一点,所以可以达到更优的复杂度。

  具体的算法分析可参考:http://www.cnblogs.com/c-cloud/p/3224788.html

二、代码:

1 /*Sample Input: 2   abcegfabcd 3   abc 4    5   Sample Output: 6   pos: 0 7   pos: 6 8  9   输入文本串T和模式串P,输出的是所有的匹配成功的位置 10 */11 12 #include
13 using namespace std;14 int next[10010];15 16 void getNext(char arr[]){17 int len = strlen(arr);18 next[0] = -1;19 int k = -1;20 int j = 0;21 22 while(j < len){23 if(k == -1 || arr[j] == arr[k]){24 j++;25 k++;26 next[j] = k;27 }28 else{29 k = next[k];30 }31 }32 }33 34 void KMP(char *P, char *T){35 int Plen = strlen(P);36 int Tlen = strlen(T);37 getNext(T);38 int j = 0;39 for(int i = 0; i < Tlen; i++){40 if(T[i] == P[j]){41 j++;42 }43 else{44 j = next[j];45 if(j == -1) j = 0;46 else i--;47 }48 49 if(j == Plen){50 cout << "pos: " << i - Plen + 1 << endl;51 j = 0;52 }53 }54 }55 int main(){56 char arr1[20];57 char arr2[5];58 scanf("%s", arr1);59 scanf("%s", arr2);60 KMP(arr2, arr1);61 }
View Code

 

三、分析:

    1、在对模式串P[m]的处理,即求出next数组的时间花费为O(m);

    2、在进行匹配的时候,近似于对文本串T[n]从头到尾扫一遍,所以时间花费为O(n);

 

转载于:https://www.cnblogs.com/Vincent-Bryan/p/5987811.html

你可能感兴趣的文章
使用XML序列化器生成XML文件和利用pull解析XML文件
查看>>
git 本地提交后如果让服务器上的GIT 自动更新拉取
查看>>
我所了解的WEB开发(2) - PS切片
查看>>
UML学习小结
查看>>
结合Jexus + Kestrel 部署 asp.net core 生产环境
查看>>
shutdown命令用法
查看>>
Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性
查看>>
vim快速指南
查看>>
Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数【转】
查看>>
同态加密-Homomorphic encryption
查看>>
【C语言入门教程】2.4 浮点型数据
查看>>
【Shiro】Apache Shiro架构之自定义realm
查看>>
[nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC
查看>>
Arc Engine 中添加气泡提示框
查看>>
瀑布式开发和敏捷开发区别
查看>>
如何使用NUnit
查看>>
AOS – 另外一个独特的页面滚动动画库(CSS3)
查看>>
springmvc 中将MultipartFile转为file,springboot 注入CommonsMultipartResolver
查看>>
(总结)Nginx配置文件nginx.conf中文详解
查看>>
oracle之时间转换
查看>>