KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。改进在于:每当一趟匹配过程中出现字符比较不同时,不需要回溯i指针,而是利用已得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。
KMP算法实现:
//KMP算法 int Index_KMP(char s[],char t[],int next[],int pos){ //此处的整型数组next为子串t对应的next值 int i=pos,j=1; while(i<=len(s)&&j<=len(t)){ if(j==0||s[i]==t[j]){ ++i;++j;c++; } else { j=next[j];c++; } } if(j>len(t)) return i-len(t); else return 0; }
在模式匹配中的具体应用:
#include<stdio.h> #include<string.h> #define max 100 int c=0; int len(char s[]){ //长度函数 int a; a=strlen(s); return a-1; } void get_next(char t[],int next[]){ //计算next值函数 int i=1,j=0;next[1]=0;next[0]=0; while(i<len(t)){ if(j==0||t[i]==t[j]){ +&