我的前一篇博客寫的是有關BF算法的分析,但其效率比較低下,因爲它是要每次不匹配的話,就要將子字符串從頭開始與主字符串的下一個位置進行匹配對照,其實根據子字符串(也稱之爲目標字符串)的特點,就可以減去一些沒必要的匹配,從而產生了KMP算法,從而引出了著名的next數組,它是用來存儲在某個位置不匹配時目標字符串應該從哪個位置開始進行匹配,其基本算法如下:
void get_next(string T, int *next)
{
int j=0;//j此處表示某位置處的前綴
int i=1;//i此處表示某位置處的後綴
next[0]=1;
while(i<next[0])
{
if(0==j||T[i]==T[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];//此處我的理解是j是根據前面的匹配過程進行T中不同元素的遍歷,分析與T[i]是否相等
}
}
上述代碼是獲得next[]數組的實現方法
int index_KMP(string S,string T,int pos)
{
int i =pos;
int j=1;
int next[255];
while(i<=S[0]&&j<=T[0]||0==j)
{
if(S[i]==T[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}
上面是KMP方法的實現