#include<stdio.h>
#include<stdlib.h>
void Insert(String1 s,char *data){
if(s->data){
free(s->data);
}
int len=0;
char * temp=data;
while (*temp) {
len++;
temp++;
}
if(len==0){
s->data=0;
s->len=0;
}else {
temp=data;
s->len=len;
s->data=(char *)malloc(sizeof (char)*(len+1));
for(int i=0;i<len;i++)
{
s->data[i]=*temp;
temp++;
}
}
}
void forceMath(String1 p,String1 q)
{
int i=0,j=0;
while (i<p->len&&j<q->len) {
if(p->data[i]==q->data[j])
{
i++;
j++;
}else {
i=i-j+1;
j=0;
}
}
if(j==q->len)
{
printf("success\n");
}else {
printf("fail");
}
}
int *GetNext(String1 s){
int *next=(int *)malloc(sizeof (int )*s->len+1);
int i=1;
int j=0;
next[1]=0;
while (i<s->len) {
if(j==0||s->data[i-1]==s->data[j-1]){
i++;
j++;
next[i]=j;
}
else {
j=next[j];
}
}
return next;
}
void printfNext(int *next,int len){
for(int i=1;i<=len;i++){
printf(i==1?"%d":"->%d",next[i]);
}
printf("\n");
}
void pri(String1 s){
for(int i=0;i<s->len;i++)
printf(i==0?"%c":"->%c",s->data[i]);
}
void kmpMatch(String1 s,String1 s1,int *next){
int i=0;
int j=1;
while (i<s->len&&j<s->len) {
if(j==0||s->data[i]==s->data[j-1])
{
i++;
j++;
}else {
j=next[j];
}
}
if (j > s1->len) {
printf("kmp match success.\n");
} else {
printf("kmp match fail.\n");
}
}
int main()
{
String1 s=init();
String1 s1=init();
Insert(s,"hello");
Insert(s1,"hell");
pri(s);
printf("\n");
int *next=GetNext(s1);
printfNext(next,s1->len);
kmpMatch(s,s1,next);
// printf("\n");
// pri(s1);
printf("\n");
// forceMath(s,s1);
return 0;
}
KMP算法
最新推荐文章于 2024-07-25 16:35:35 发布