本博文源于浙江大学《数据结构》,今天跟随姥姥学习KMP算法,KMP算法是三位大师根据字符串模式匹配研究出来的一种算法。它的时间复杂度从O(n*m)===>O(n+m),堪称一个时间复杂度的飞跃,而这些无非是算法设计的好,算法是程序员的魂!
KMP函数实现
KMP首先要获得原串和目标串的长度,然后去获得最长真子串,然后根据strstr函数一样两个指针不停的位移,如果位移两者不相等,调用match函数继续位移,一次遍历就把结果实现,强啊!
BuildMatch的实现
还是先获得字符串的长度,然后将match数组的0设为-1,开始进行位移。
源码附上
//kmp实现
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int Position;
#define NotFound -1
void BuildMatch(char *pattern,int *match)
{
int i,j;
int m= strlen(pattern);
match[0] = -1;
for(j=1;j<m;j++) {
i = match[j-1];
while((i>=0) && (pattern[i+1]!=pattern[j]))
i = match[i];
if(pattern[i+1] == pattern[j])
match[j] = i+1;
else
match[j] = -1;
}
}
Position KMP(char *string,char *pattern)
{
int n = strlen(string);
int m = strlen(pattern);
int s,p,*match;
if(n<m) return NotFound;
match = (int *)malloc(sizeof(int)*m);
BuildMatch(pattern,match);
s = p = 0;
while(s<n && p<m) {
if(string[s]==pattern[p])
{
s++;
p++;
}else if(p>0) p = match[p-1]+1;
else s++;
}
return (p==m)?(s-m):NotFound;
}
int main()
{
char string[] = "This is a simple example.";
char pattern[] = "simple";
Position p = KMP(string,pattern);
if(p==NotFound) printf("Not Found.\n");
else printf("%s\n",string+p);
return 0;
}