本文主要講解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算法的核心思想。
這裏有幾個例子: