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算法的核心思想。
這裏有幾個例子:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

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