【算法讲解】前缀函数(KMP的next函数)

     这里的主要目的是理解KMP算法中next[]数组的含义和实现过程:

前缀函数主要是求出模式串中的next数组,那么什么是模式串呢?模式串模式串的概念很简单。举个例子:“给出一个字符串 T,再给出 n 个字符串 S1、S2...Sn,问 S1、S2...Sn 中有哪些是 T 的子串?”在这个例子中,S1、S2...Sn 便是 n 个模式串,T便是被匹配串。模式串是用来与被匹配串匹配的。

其实,个人感觉,这里主要是理解next数组的意义: 若模式串 P 的前 i 个字符组成的子串为S,那么S的前next[i]个字符’与‘S的后 next[i]个字符’相同。
如果理解了这个意思,那么这个前缀函数的模板就很好看懂了。
模板:
//T是被匹配的串。 

//P是模式串。 

//字符串都是从下标1开始的。 

void COMPUTE_PREFIX_FUNCTION(char P[]) 

{ 

    int m=strlen(P+1); //这里是因为要从P[ 1 ]开始输入字符串的

    next[1]=0; 

    for(int k=0,q=2;q<=m;q++) 

//这段代码我感觉用通俗的语句说就是k是用来表示子串中前k个和后k个是相同的,q是用来遍历数组的需要

    { 

        while(k>0&&P[k+1]!=P[q]) 
//如果P[k+1]和P[q]中字符不同说明匹配是失败,要把k的值重新退到next[ k ],直到两者相同才停止。这样做的好处是没必要再重新从头再来,节约时间。

            k=next[k]; 

        if(P[k+1]==P[q]) 

            k++; 

        next[q]=k; 

    } 

} 


你可能感兴趣的:(【算法】)