KMP
#include <stdio.h> void perfix(char P[],int U[],int lenP); void match(char T[],char P[],int U[],int lenT,int lenP); void perfix(char P[],int U[],int lenP){ U[0]=-1; int k=-1; int i=1; for(;i<lenP;i++){ while(P[k+1]!=P[i]){ if(k==-1) break; k=U[k]; } if(P[k+1]==P[i]) k=k+1; U[i]=k; } } void match(char T[],char P[],int U[],int lenT,int lenP){ int m=lenP; int n=lenT; int k=U[0]; int i=0; for(;i<n;i++){ while(k>-1&&P[k+1]!=T[i]){ if(k==-1) break; k=U[k]; } if(P[k+1]==T[i]){ k++; if(k==(m-1)){ printf("location is %d\n",i-k); k=U[k]; } } } } int main(){ char P[6]={'a','b','a','b','c','a'}; char T[9]={'c','a','a','b','a','b','c','a','b'}; int U[6]; perfix(P,U,6); match(T,P,U,9,6); return 0; }
KMP算法是一种线性查找匹配算法,在长度为n的字符串中查找长度为m的字符串所花费的时间为n.
如果是传统的字符串匹配,那么需要的时间是m*n。
感觉自己基础不牢固。问题1,char P[6]={'a','b','a','b','c','a'};
char T[9]={'c','a','a','b','a','b','c','a','b'};
在void perfix(char P[],int U[],int lenP);中P的值为P+T,因为在声明字符数组是没有加入结束标志,所以编译器不知何时结束。在C中‘\0’作为字符串的结束标志,加与不加都不会报错,但是如果不加就不好判断字符串何时结束,解决方法是在参数中加入数组元素的个数。
问题2,char P[6]={'a','b','a','b','c','a'};sizeof(P)=6。但是在void perfix(char P[],int U[],int lenP);中sizeof(P)=4.因为在函数参数中char P[]其实就是char *P,指针自身长度就是4。

浙公网安备 33010602011771号