算法与数据结构-KMP算法

        定义主串为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];
    }
}


 

你可能感兴趣的:(数据结构,算法)