// KMP算法
#include <stdio.h>
#include <stdlib.h>
typedef struct String
{
char* ch;
int len;
}String;
// 初始化
String initString()
{
String string;
string.ch = NULL;
string.len = 0;
return string;
}
//赋值
void stringAssing(String* S,char* str)
{
int len = 0;
char* temp = str;
while (*temp != '\0') //查找str的长度用len保存
{
len++;
temp++;
}
if(len == 0)
{
printf("赋值不合法\n");
return;
}
temp = str; //temp指针回到开始位置
S->ch = (char *)malloc(sizeof(char) * (len + 1));
for (int i = 0; i < len; ++i) {
S->ch[i] = *temp;
temp++;
S->len++;
}
}
//求解next数组 数组下标从0开始
int* getNext(String *S)
{
int* next = (int*)malloc(sizeof(int) * S->len);
int i = 0;
int j = -1;
next[i] = j;
while (i < S->len - 1)
{
if(j == -1 || S->ch[i] == S->ch[j])
{
i++;
j++;
next[i] = j;
} else{
j = next[j];
}
}
return next;
}
//打印字符
void printString(String* S)
{
if(S->len == 0)
{
printf("字符串是空串!\n");
return;
}
for (int i = 0; i < S->len; ++i) {
printf("%c ",S->ch[i]);
}
printf("字符串的长度为:%d\n",S->len);
}
//打印next数组 len表示next数组的长度不包含\0 即模式串的长度
void printNext(int* next,int len)
{
printf("Next数组值打印如下:\n");
for (int i = 0; i < len; ++i) {
printf("%d",next[i]+1);
}
}
//KMP算法实现
void kmpMatch(String* master,String * sub,int * next)
{
int i = 0;
int j = 0;
while (i < master->len && j < sub->len)
{
if(j == -1 || master->ch[i] == sub->ch[j])
{
i++;
j++;
} else{
j = next[j];
}
}
if(j >= sub->len)
{
printf("匹配成功,在主串中的位置为:%d\n",i-j+1);
} else{
printf("匹配失败\n");
}
}
int main()
{
String str = initString();
stringAssing(&str,"abcdsdfwsergberthcvb");
printString(&str);
String text = initString();
stringAssing(&text,"berthcvb");
printString(&text);
int* next = getNext(&text);
//printNext(next,12);
kmpMatch(&str,&text,next);
return 0;
}
2021-08-08 KMP算法C语言实现
最新推荐文章于 2022-04-28 19:52:55 发布