<pre name="code" class="cpp">/*
這是對失配函數沒有優化的MP算法,最壞情況下也能達到O(m + n)的複雜度,
其中m爲模板串長度,n爲文本串長度.
此算法還可以計算模板串在文本中出現的次數(可重疊)
*/
char s[maxn],t[maxn];//s爲文本,t爲模板
int f[maxn];//失配函數
void getFail(char *P,int *f){//注意適配函數是對模板進行處理
int m = strlen(P);
f[0] = 0,f[1] = 0;
for(int i = 1;i < m;i++){
int j = f[i];
while(j && P[i] != P[j])j = f[j];
f[i + 1] = P[i] == P[j] ? j + 1 : 0;
}
}
int find(char *T,char *P,int *f){//其中T爲文本,P爲模板,在T中找P的第一次出現的位置。
int n = strlen(T),m = strlen(P);
getFail(P,f);//初始化失配函數
int j = 0;
for(int i = 0;i < n;i++){
while(j && P[j] != T[i])j = f[j];
if(P[j] == T[i])j++;
if(j == m){
return i - m + 1;//匹配上的位置
/*
若要知道模板在文本中出現的次數,可以這樣寫
ans++;//其中ans爲出現次數
j = f[j]//如果計算重疊的就這樣寫,例如aaaa, aa ,那麼出現的地方爲0,1,2
j = 0;//如果計算不重疊的就這樣寫,例如aaaa, aa,那麼出現的地方爲0,2
*/
}
}
}
KMP算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.