#include<stdio.h>
#include<string.h>
typedef char String;
void get_nextval(String t[], int* nextval)
{
int i=0, j=-1,tl= strlen(t);
nextval[0] = -1;
while (i<tl)
{
if (j==-1|| t[i] ==t[j])
{
++i; ++j;
if (t[i] != t[j])
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];//若字符不相同,则j值回溯
}
}
int index_KMP(const String *s, String t[], int pos)
{
int i = pos;//i用于主串S当前位置下标值,若pos不为1,则从pos位置开始匹配
int j = 0,sl = strlen(s),tl = strlen(t), nextval[20];//j用于字串T中当前位置下标值;
get_nextval(t, nextval);
while (i <sl&&j<tl )
{
if (j == -1 || s[i] == t[j])
{
++i; ++j;
}
else j = nextval[j];
}
if (j >= tl)
return i -tl;
else return 0;
}
int main()
{
String t[] = "abab", s[] = "qqweasababreter", * p;
int l;
if (l=index_KMP(s, t, 0))
printf("%s\n", p = s + l);
else
puts("Not found !");
}``
KMP模式匹配算法改进,可以直接运行
最新推荐文章于 2023-10-03 20:15:38 发布