KMP是一种改进字符串匹配的算法。
KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。
看了好多KMP算法是如何进行的,阮一峰写的KMP算法。
KMP主要的内容就是求next数组。
给你两个字符数串:
abababa (目标串)
abac (模式串)
用next数组记录模式串的匹配程度(我是习惯从0开始,当然也可以从-1开始):
a b c a
0 0 0 1
KMP算法讲解视频:
https://www.bilibili.com/video/av3246487?from=search&seid=17974959124889101719
https://www.bilibili.com/video/av11922005?from=search&seid=17974959124889101719
代码:
#include<stdio.h>
#include<string.h>
char a[200010],b[100010];
int next[100010];
int lena,lenb,n;
void get_next() //用来记录模式串
{
int i,j;
j = 0;
i = 1;
while(i < lenb)
{
if(j == 0 && b[j] != b[i]) //next[1]与next[0]都不相同
{
next[i] = 0; //把next[1]标记为0
i ++; //判断下一位与第一位
}
else if(j > 0 && b[j] != b[i])//失配了
{
j = next[j - 1]; //回溯
}
else
{
next[i] = j + 1; //如果与第一位相同,j移向下一位继续比较
i++;
j++;
}
}
}
int kmp()
{
int i,j;
i = 0;
j = 0;
while(i < lena && j < lenb)
{
if(j == 0 && b[j] != a[i])
{
i ++;
}
else if(j > 0 && b[j] != a[i])
{
j = next[j - 1];
}
else
{
i ++;
j ++;
}
}
if(j >= lenb)
printf("Yes\n");
else
printf("No\n");
}
int main()
{
int lena,lenb;
while(scanf("%d",&n)!=EOF)
{
scanf("%s%s",a,b);
get_next();
kmp();
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
return 0;
}