博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KMP算法研究
阅读量:4302 次
发布时间:2019-05-27

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

本人愚笨,CSDN上看了很多解法都不了解,而且很多解法都有些问题。自己看了书研究了一个晚上才大概明白了这一原理。特此附上自己写的解法和见解。

KMP是对于字符串匹配蛮力解法的一个改进,原理就是在求出模式子串自己内部的重复模式,举个简单的例子,主串S[] = "ababaababcb"子串T[] = “ababc”,T[0]~T[1] = T[2]~T[3],如果前次比较主串已经有S[0]~S[3]匹配上了子串T[0]~T[3],只是S[4]与没有匹配上,就有S[2]~S[3]是等于T[0]~T[1]的,那么就可以略过,而直接比较S[4]与T[2]了。

而求数组next[]本质就是求子串的重复模式。

#include
#include
#include
int *getnext(char *cht);int main(int argc, char *argv[]){ if (argc != 3) { printf("usage:%s Mstring Tstring.\n",argv[0]); exit(1); } int slen = strlen(argv[1]); //主字符串 int tlen = strlen(argv[2]); //模式字符串 char *chs = (char *)malloc((slen+1)*sizeof(char)); char *cht = (char *)malloc((tlen+1)*sizeof(char)); strcpy(chs,argv[1]); strcpy(cht,argv[2]); //获得next int *next = getnext(cht); //匹配 int index=-1, i=0, j=0; while (chs[i]!='\0' && cht[j]!='\0') { if (chs[i] == cht[j]) { i++, j++; } else { j = next[j]; if (-1 == j) i++, j++; } } if (cht[j] == '\0') index = i - tlen; printf("index = %d\n",index+1); return 0;}int *getnext(char *cht){ int tlen = strlen(cht); int j=1, k=-1; int *next; next = (int *)malloc(tlen*sizeof(int)); if (NULL == next) { perror("malloc"); exit(1); } next[0] = -1; while (j
经测试,代码没有问题。

转载地址:http://zemws.baihongyu.com/

你可能感兴趣的文章
java中的泛型总结
查看>>
java中的正则操作总结
查看>>
java中的IO操作总结(一)
查看>>
java中的IO操作总结(二)
查看>>
java中的IO操作总结(三)
查看>>
java中的IO操作总结(四)
查看>>
Java 内部类种类及使用解析
查看>>
匿名内部类精讲
查看>>
如何在ubuntu下设置永久的alias别名
查看>>
Apache与Nginx的优缺点比较
查看>>
3种PHP连接MYSQL数据库的常用方法
查看>>
linux命令(6) zip/unzip及tar压缩与解压文件命令笔记
查看>>
linux命令(7)ubuntu的vim命令用法
查看>>
使用nginx配置多个php-fastcgi负载均衡
查看>>
CURL抓取网页内容并用正则提取。
查看>>
Ngin的配置文件nginx.conf完整配置说明(包括fastcgi和负载均衡设置)
查看>>
浏览器显示网页的机制
查看>>
CSS基础知识
查看>>
Nginx+PHP-FPM优化技巧总结
查看>>
Ubuntu安装Torque教程
查看>>