#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 100
typedef struct {
char data[maxsize];
int length;
} SqString;
void GetNext(SqString t, int next[]) {
int j, k;
j = 0;
k = -1;
next[0] = -1;
while (j < t.length - 1) {
if (k == -1 || t.data[j] == t.data[k]) {
j++;
k++;
next[j] = k;
}
else
k=next[k];
}
}
int KMPIndex(SqString s, SqString t) {
int next[maxsize], i = 0, j = 0;
GetNext(t, next);
while(i<s.length&&j<t.length){
if(j==-1||s.data[i]==t.data[j]){
i++;
j++;
}
else
j=next[j];
}
if(j>=t.length)
return (i-t.length);
else
return(-1);
}
int main(void) {
SqString s, t;
int index;
puts("请输入目标串");
scanf(" %s",s.data);
s.length=strlen(s.data);
puts("请输入模式串");
scanf("%s",t.data);
t.length=strlen(t.data);
index = KMPIndex(s, t);
printf("从第%d个开始,目标串中出现模式串\n", index+1);
return 0;
}
KMP算法
最新推荐文章于 2023-04-09 17:43:52 发布
前些天在自学字符串的模式匹配,遇到了了一些问题——KMP算法中模式串是如何回溯。这个问题我一直没有弄明白。经过一天的代码调试,终于弄出了点眉目。以下是我的代码