有关KMP的算法具体的实现网上有很多,不具体阐述。这里附上c的实现。

谈谈我自己的理解。KMP相较于朴素算法,其主要目的是为了使主串中的遍历参数i不回溯,而直接改变目标串中的遍历参数j。

比如说要是目标串中没有一个重复的字符,那么当遍历到主串中的i与目标串的j不想等时,只需要把目标串的遍历参数j归1(在这里字符串的首字符用来保存该串的长度),从主串中i的位置从头比对目标串。然后继续向后比较、遍历主串即可。

但是对于大部分的目标串,并不是所有的字符都不同。那么就引入了重复度这个概念。创建next数组,用next数组保存重复度。重复度即为从头开始,第一次出现相同的字符的位置。(如 abaabx 中,第6位的x之前为ab,第一次出现ab且和现在不同的位置是3,那么我就直接回到3继续对比)

遍历到主串,发生不相等时间,目标串中的j自动匹配到next数组中保存的位置,从而主串参数不回溯的目的。

网上还有很多人说strstr比自己写的kmp要快,我觉得大概是strstr其实也用了kmp,但是语句更精简,直接用汇编语言,底层优化之类的(blablabla也是瞎说没有考证)。总之kmp的自动匹配的思维,是非常具有启发意义的。(当然还牵扯到算重复度的思维)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define N 1000 typedef char* string; void get_String(string a){
string b = (string) malloc (sizeof(char)*N);
gets(b);
a[0] = strlen(b),a[1] = '\0';
strcat( a , b );
} void get_next(string T,int *next){
int i = 1,j = 0;
next[1] = 0;
while(i<(int)T[0]){
if(j == 0||T[i] == T[j]){
++i,++j;
if(T[i] != T[j]) next[i] = j;
else next[i] = next[j];
}else j = next[j];
}
} int index_KMP(string S,string T,int pos){
int i = pos,j = 1,*next;
next = (int *)malloc(sizeof(int)*strlen(T));
get_next(T,next);
while(i <= S[0]&&j <= T[0]){
if(j == 0||S[i] == T[j]) i++,j++;
else j = next[j];
}
if(j >T[0]) return i - T[0];
else return 0;
} int main(){
string S,T;
int ans; //初始化字符串S 和 T
S = (string) malloc (sizeof(char)*N);
T = (string) malloc (sizeof(char)*N); //输入串S 和 T
//其中S[0]和T[0]分别保存了该串中一共有多少个字符
get_String(S);
get_String(T); ans = index_KMP(S,T,1);
if(ans!=0) printf("目标串在母串中出现的位置是 %d \n",ans);
else printf("子串不在目标串中出现\n");
return 0;
}

最新文章

  1. Mybatis入门DEMO
  2. samba server install
  3. YAFFS2文件系统分析(转)
  4. CentOS 6.3下PostgreSQL 的安装与配置
  5. U3d中实现A*寻路,附源文件
  6. plist 读取 swift
  7. ios开发--27个提升效率的iOS开源库推荐
  8. dl-ssl.google.com
  9. SecureCRT上使用公钥登陆Linux服务器
  10. 【Lucene】近实时搜索
  11. VR应用向导,全球Top10 VR应用排行榜
  12. Big Endian与Litter Endian
  13. 怎样给Win7系统设置一个默认的浏览器
  14. linux_rsync定时备份
  15. Object类----toString,equals,hashcode
  16. laravel-安装验证码扩展
  17. RabbitMQ 基本概念总结
  18. 《剑指offer》-数组乘积,不使用除法
  19. 深度学习课程笔记(九)VAE 相关推导和应用
  20. 持续集成之Jenkins插件使用(一)- 多个job之间的串并联

热门文章

  1. python实战第一天-paramiko模块并练习
  2. 【机器学习笔记之三】CART 分类与回归树
  3. 【社交系统研发日记五】ThinkSNS+如何计算字符显示长度?
  4. 移动端表层div滑动,导致底层body滑动(touchmove的阻止)
  5. 表格布局扩展/DW设计界面中快速整体布局页面的操作
  6. [Python] wxPython 菜单栏控件学习总结(原创)
  7. Android 主题theme说明 摘记
  8. 一起来学Go --- (go的变量)
  9. 利用mvc filterconfig属性实现权限验证
  10. Oracle 11g的安装