您的位置:首页 > 理论基础 > 数据结构算法

算法与数据结构-KMP算法

2012-02-16 14:08 260 查看
定义主串为src,子串(模式)为sub,简单讲KMP算法就是在比较src[i]与sub[j]时,若匹配失败,不回溯i,而是根据j=next(j)来调整j的值继续与i比较。

next(j)函数值根据sub前k个字符与到j-1为止的后k个字符相等的最大k值来确定。

if(j==0) next[j]=-1;
else if(k≠∅) next[j]= MAX{ k | 0≤k<j 且 sub[ 0……k-1 ] = sub[ j-k……j-1 ] } ;
else next[j]=0;


给出个人的一段匹配代码:

/**
* KMP模式匹配 返回匹配成功的索引 失败则返回-1
* src:主串
* sub:子串(模式)
* next:模式定位的next值
*/
int indexByKMP(char src[],char sub[],int next[]){
int i=0,j=0,srcLen=strlen(src),subLen=strlen(sub);
while(i<srcLen && j<subLen){
if(j<0||src[i]==sub[j]){ i++;j++; }
else j=next[j];
}
if(j>=subLen)return i-subLen;
return -1;
}


初始化next的代码如下:

/**
* 初始化next
* sub:子串(模式)
* next:模式定位的next值
*/
void initNext(char sub[],int next[]){
int i=0,j=-1,len=strlen(sub);
next[0]=-1;
while(i<len){
if(j==-1||sub[i]==sub[j]){ i++;j++;next[i]=j; }
else j=next[j];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: