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;
}

posted on 2013-04-21 23:36  仙人长  阅读(112)  评论(1)    收藏  举报

导航