KMP算法是一种优秀的字符串匹配算法,但是KMP算法中最难理解的就是next数组了,今天我就用最简单的描述来帮助大家建立next数组 如果有个字符串为char* c= “abcdabcdaef”
然后我们建立一个next数组next[strlen(c)+1]
Target_index 0 1 2 3 4 5 6 7 8 9 10
Target a b c d a b c d a e f
Next_index 0 1 2 3 4 5 6 7 8 9 10
next 0 0 0 0 1 2 3 4 5 0 0
next数组里面的元素值是看前缀和后缀共有元素的长度
当index=0时,没有共有元素,故next[0]=0
当index=1时,”a b”的前缀为”a”,后缀为”b”,无共有元素,故也为0
当index=2时,”abc”的前缀为”a”,”ab”,后缀为”bc”,”c”,故无共有元素,所以next[2]=0;
当index=3时,”abcd”的前缀为”a”,”ab”,”abc”,后缀为”bcd”,”cd”,”d”,故无共有元素,所以next[3]=0;
当index=4时,”abcda”的前缀为”a”,”ab”,”abc”,”abcd”,后缀为”bcda”,”cda”,”da”,”a”,有个共有元素”a”,所以next[4]=strlen(“a”)=1;
同理当index=4时,next[4]=strlen(“ab”)=2;
当index=8时,拥有共有元素“a”,”abcda”,next[4]=strlen(“abcda”)=5;
通过这种分析我们发现 当求next[i]时,我们只需要将Target[i]和Target[next[i-1]]进行比较,如果相等,则next[i]=next[i-1]+1,否则,next[i]=0
#include <stdio.h>
#include <string.h>
void GetKMP(char* target,int target_length,int next[]);
int main()
{
char* s="aabbccddaabbccdde";
int* next=new int[strlen(s)];
GetKMP(s,strlen(s),next);
for(int i=0;i<strlen(s);i++)
{
printf("%d ",next[i]);
}
return 0;
}
void GetKMP(char* target,int target_length,int next[])
{
next[0]=0;
int j;
for(int i=1;i<target_length;i++)
{
j=next[i-1];
if(target[j]==target[i])
{
next[i]=next[i-1]+1;
}
else
{
next[i]=0;
}
}
}
现在大家应该明白了吧