KMP算法C语言——For初学者

本文主要讲解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算法的核心思想。
这里有几个例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章