kmp字符串匹配法
先举例说下kmp查找算法的思想吧(可能我描述得不是很好如果用图文结合就好描述点,下面有算法代码可以直接用)
在str1=ababae中查找str2=abae 首先匹配 设置变量i=0,j=0 str1[i]==str2[j] i++,j++ 此时i=1 j=1 str1[i]==str2[j] i++,j++ 此时 i=3 j=3 str1[i]!=str2[j]
注意也就是说str1[3]!=str2[3] 所以就要用str2[x] x为next数组的的第[j] 个元素开始和 又和str1[i]去匹配 因为i之前str2[2]和比str1[2]过 而
str2[0]又和str2[2]相等所以 str2[x]=str2[1] 这样循环查找 退出条件是,i一直加加加到大于str1时或者j大于str2的长度时就退出. 当j>str2长度时表时找查成功否则查找失败
#include <stdio.h>
#include <string.h>
//创建要查找的字符串的next数组
void get_next(char *str,int len,int array[])
{
int i = 1,j = 0;
array[1]=0;
while(i < len)
{
if(j==0 || str[i] == str[j])
{
i++;
j++;
array[i] =j;
}else
{
j = array[j];
}
}
}
//查询方法 查找target字符串在src中的第n个位置(按下标算位置的话要-1)查找成功返回位置 n个位置 失败返回0
int search(char *src, char *target)
{
int i=1,j=1,m,n;
m = strlen(src);
n = strlen(target);
int array[n];
get_next(target,n,array);
while(i <= m && j <= n)
{
if(j==0 || src[i-1] == target[j-1])
{
i++;j++;
}else
j = array[j];
}
if(j > n)
return i-n;
return -1;
}
//测试代码
int main(void)
{
char *a="abacabcdeababe";
char *b="abab";
int index;
index=search(a,b);
if(index>-1)
printf("find String %s is the %d of the String %s",b,index,a);
else
printf("can't find the %s",b);
return 0;
}
浙公网安备 33010602011771号