关于KMP算法的详解
//传统方式
void find(char t[],char p[]){
int m = strlen(t);
int n = strlen(p);
int i,j,k;//k:匹配串下标,j:模式串下标
for(k=0;k<m;k++){
j = 0; //每次从0开始
i = k;
while(j<n){
if(p[j]==t[i]){
i++;
j++;
}else{
break;
}
}
if(j==n){
printf("在%d处匹配\n",k);
break;
}
}
}
//关于求解KMP。步骤
//第一步 初始化
//第二步 前后缀相同
//第三步 前后缀不同
//第四步 更新next数组
void makeNext(char p[],int next[]){
int i; //指向后缀末尾
int j = 0;//指向前缀末尾,并且代表前缀的长度
next[0] = 0;
for(i = 1;i<strlen(p);i++){
//如果i j所指前后缀字符不相等
while(j>0&&p[i]!=p[j]){
//这里看不懂的可以看下面一张图
j = next[j-1];
//j--;也行
}
if(p[j]==p[i]){
j++;
}
next[i] = j;
}
}
void kmp(char t[],char p[]){
int next[3] = {0};
makeNext(p,next);
int i=0,j=0;//i是匹配串的下标,j是模式串的下标
while(i<strlen(t)&&j<strlen(p)){
//如果相等就继续比较
if(j==0||p[j]==t[i]){
i++;
j++;
}else{//不相等就要跳跃
j = next[j-1];
}
}
if(j>=strlen(p)){
printf("模式串匹配在%d处\n",i-j);
}else{
printf("匹配失败了");
}
}