前言
简单匹配算法和KMP算法都是对字符串进行匹配,判断一个字符串是否是另一个字符串的子串;
KMP算法也是我们数据结构中比较重要的算法,今天我配合图解对算法进行解析,并配套相应的代码。
另外在我一篇文章中对next数组和nextval数组有了一些解释和说明,将会配套这篇文章的KMP算法进行讲解,如果不了解next数组和nextval数组的朋友可以看一下我的另一篇文章了解一下next数组和nextval数组再来对KMP算法进行分析。
一、BF算法
1.讲解
BF算法本质上就是匹配字符串 ,看下图:

我们用x和y表示正在匹配的下标数
起始时
x=0;y=0;
看这样两串字符,首先我们比较第一位,不匹配,x+1,y=0,匹配主串的第二位和副串的第一位,匹配,
x+1,y+1,后面一位也匹配 x+1 y+1,到达第三位时也就是下标分别为3和2时不匹配,y=0 x=x-y+1,这样再次重新匹配可以知道规律
//当字符匹配时
x++;
y++;
//字符不匹配时
x = x - y + 1;
y = 0;
//我们用count作为记录连续匹配时的字符个数,如果count的数等于连续匹配相同时的字符的个数时可以得到匹配成功,其余情况则不成功
2.代码实现
代码如下(示例):
#define MAX 100
struct stu {
char ch[MAX];
int length;
};
int realize(struct stu s, struct stu l)
{
int x = 0;
int y = 0;
int count = 0;
while (x < s.length && y < l.length)
{
if (s.ch[x] == l.ch[y])
{
x++;
y++;
count++;
}
else
{
count = 0;
x = x - y + 1;
y = 0;
}
}
if (count == y)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
struct stu s;
scanf("%s", s.ch);
/*printf("%s", s.ch);*/
s.length = strlen(s.ch);
//test(s.ch);
struct stu l;
scanf("%s", l.ch);
l.length = strlen(l.
本文介绍了KMP算法的原理和实现,通过对比BF算法来阐述KMP如何解决回溯问题,提高字符串匹配效率。同时,文章还探讨了KMP的进阶内容,包括next数组和nextval数组的应用,提供了详细的代码示例。
最低0.47元/天 解锁文章
2452

被折叠的 条评论
为什么被折叠?



