菜鸟一枚,
刚刚学习数据结构与算法,
为了加深理解,
所以与同学们分享学习过程。
今天学习的是,
KMP算法!!!
上代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void prefix_table(char pattern[],int prefix[],int n)
{
prefix[0] = 0; //第一个必为0
int len = 0; //比较的长度(或者说是位置)最长前后缀的长度
int i=1; //检测第i个字母
while(i<n)
{
if(pattern[i] == pattern[len])
{
len++;
prefix[i] = len; //i处的最长前后缀
i++; //进行下一个字母
}
else
{
if(len>0)
{
len = prefix[len-1];
}
else
{
prefix[i]=len; //len==0
i++;
}
}
}
}
void move_prefix_table(int prefix[],int n)
{
int i;
for(i = n-1;i > 0;i--)
{
prefix[i] = prefix[i-1];
}
prefix[0] = -1;
}
void kmp_search(char text[],char pattern[])
{
int n = strlen(pattern);
int m = strlen(text);
int* prefix = malloc(sizeof(int) * n);
prefix_table(pattern,prefix,n);
move_prefix_table(prefix,n);
//text[i],len(text) = m
//pattern[j],len(pattern) = n
int i = 0;
int j = 0;
while(i < m)
{
if(j == n-1&&text[i] == pattern[j])//全部匹配上
{
printf("Found pattern at %d\n",i-j);
j = prefix[j];//检查后面还有没有能匹配的
}
if(text[i] == pattern[j])
{
i++;
j++;
}
else
{
j = prefix[j];
}
if(j == -1)
{
i++;
j++;
}
}
}
int main()
{
char pattern[] = "ABABCABAA";
char text[] = "ABABABABCABAAB";
kmp_search(text,pattern);
// int prefix[9];
// int n = 9;
//
// prefix_table(pattern,prefix,n);
//
// int i;
// for(i = 0;i < n;i++)
// {
// printf("%d\n",prefix[i]);
// }
return 0;
}
谢谢同学们的阅读!!!