KMP字符串查找
Posted TheQi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP字符串查找相关的知识,希望对你有一定的参考价值。
kmp查找首先要创建next数组
next数组中装的是最大前缀和后缀相等的数量
然后进行KMP查找,代码如下
int KMP(char* str,int length1,char* arr,int length2)
{
if(str == NULL || arr == NULL || length1 <= 0 || length2 <= 0) return -1;
//创建next数组
char* pNext = (char*)malloc(sizeof(char)*length2);
memset(pNext,0,sizeof(char)*length2);
int j;
for(int i=1;i<length2;i++)
{
//如果这个元素和他应该比较的元素相等
if(arr[pNext[i-1]] == arr[i])
{
pNext[i] = pNext[i-1]+1;
}
//如果不相等,再向前找,直到找到pNext[0]
else
{
j = pNext[i-1];
while(j != 0 && arr[pNext[j-1]] != arr[i])
j = pNext[j-1];
//判断循环跳出的条件
if(j == 0)
{
if(arr[0] != arr[i])
pNext[i] = 0;
else
pNext[i] = 1;
}
else
pNext[i] = pNext[j-1]+1;
}
}
//遍历
//index是小字符串的下标
int index = 0;
int i;
for(i=0;i<length1;i++)
{
//如果相等两个指针一起向后移动
if(str[i] == arr[index])
{
index++;
if(index == length2)
break;
}
else
{
//调整第二个指针的位置
while(index != 0 && str[i] != arr[index])
{
index = pNext[index-1];
}
//向前找到匹配的
if(str[i] == arr[index])
index++;
}
}
return i-index+1;
}
以上是关于KMP字符串查找的主要内容,如果未能解决你的问题,请参考以下文章