本文主要讲解KMP查找的算法,对于初学者本算法还是有一点难度的,这种查找的方法确实提高了查找效率。
KMP是什么???click here。
好了现在知道KMP具体是干什么的了,更详细的在维基百科。
本文代码用C语言写的,编译环境是Code::Blocks,当然本人能力有限,难免有疏漏的地方,本文只是提供一个方法。
好的,代码如下:
#include<stdio.h>
#include<string.h>
char str[50], pat[20], rep[20], ans[50];
int next[20],flag=0;
void stringmatch()
{
int i;//记录str的位置
int j=0;//记录pat的位置
int k = -1;//next内存的数值
next[0] = -1;
//开始设next的第一项是-1,因为,即使next[0]不匹配也不能往前移动了
//此时,i因该下移一位,接着进行匹配
//生成next
while (j < strlen(pat)-1) {
if (k == -1 || pat[j] == pat[k]) {
next[++j] = ++k;
}
else {
k = next[k];
}
/*******解释******
next[0]设置成-1,这个时候i向后移动一位
next[1]设置成0,因为在第二项匹配不上的时候,只能跳到第一项
while的循环条件是遍历pat内的字符串
*/
}
i=0;
j=0;
k=0 ;
while(k<strlen(str))//遍历整个字符串str
{
while(i<strlen(str)&&(j<strlen(pat)||j==-1))
{
if(j==-1||str[i]==pat[j])//如果匹配成功i,j同时向后移动一位
{
i++;
j++;
}
else
{
j = next[j];//如果匹配到不一样的字符,j不从0开始,而从next[j]开始
}
}
// printf("i=%d \n",i);
if(j==strlen(pat))//如果找到pat,那么就进行替换
{
flag=1;
int temp;
for(temp=0;temp<i-strlen(pat);temp++)
ans[temp]=str[temp];
ans[temp]='\0';//为多次替换准备
strcat(ans,rep);
char str_1[50];
for(temp=0;temp<strlen(str)-i+1;temp++)
str_1[temp]=str[temp+i];
strcat(ans,str_1);
strcpy(str,ans);
i=i-strlen(pat)+strlen(rep);
k=i;
j=0;
}
else
if(flag==0||flag==1)
break;
}
strcpy(ans,str);
}
int main()
{
printf("\n请输入主串:");
gets(str);
printf("\n请输入模式串:");
gets(pat);
printf("\n请输入替换串:");
gets(rep);
stringmatch();
if(flag == 1)
printf("\n最终结果是 %s", ans);
else
printf("\n未能匹配模式串");
return 0;
}
基本上难得地方都有解析。KMP的关键就在next数组的求取,这也是KMP算法的核心思想。
这里有几个例子: