您的位置:首页 > 编程语言 > C语言/C++

【KMP字符串匹配】C语言实现 代码+视频详解

2020-07-14 21:05 211 查看

这是我看过讲得最好的KMP算法的视频了~视频适合小白,还请大佬指教!
建议先看完视频,再配上文末代码食用!
视频含代码,算法步骤讲解分析,通俗易懂。(声音好听)

KMP字符串匹配算法1

KMP字符串匹配算法2

注意第一段视频中主要分析讲解步骤,第二段视频开始讲解代码。

下面是本人看完视频后敲的代码,配上自己写的注释方便理解。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void prefix_table(char pattern[] , int prefix[],int n)//找到前缀表
{//三个参数分别表示需要比较的串,前缀表,待比较串/前缀表的长度
prefix[0]= 0;//第一位永远等于0
int len = 0;//len表示此时最长公共前后缀的长度
int i = 1;//从第1位置字母开始检测
while(i < n)
{
if( pattern[i] == pattern[len])//若相等,len++
{
len++;
prefix[i] = len;//在前缀表中填上这个长度
i++;//往后检测下一个字母
}
else//若不相等
{
if(len>0)
len = prefix[len - 1];  //将len对应于prefix前一个位置
else//当len = 0,
{
prefix[i] = len;//此时已经没有办法再向后退了,直接等于0
i++;
}
}
}
}
void move_prefix_table(int prefix[],int n)
{//把前缀表向后移一位,空出来的位置填上-1,方便KMP操作。由于前缀表严格来说并不包括最后完整的串的公共前后缀,所以原来的最后一位被覆盖没有关系
int i;
for(i = n-1;i>0;i--)
{
prefix[i] = prefix[i-1];
}
prefix[0] = -1;
}
void KMP_search(char text[],char pattern[])
{//在text里面搜索pattern
int i = 0,j = 0;
int m = strlen(text);
int n = strlen(pattern);
int* prefix = malloc(sizeof(int)*n);
prefix_table(pattern,prefix,n);
move_prefix_table(prefix,n);

//text[i]表示text中第i个,text长度为m
//pattern[j]表示pattern中第j个,pattern长度为n

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[]    = "ABABABCABAABABABAB";
KMP_search(text,pattern);
int i;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: