kmp算法

  kmp算法,就是模式串匹配算法,但又不同于BF算法的。它和BF算法之间的最大区别在于,kmp算法在匹配前会对目标串进行一定的处理。会用到一个next数组用来存放,在匹配时第i个字符失配时应将目标串移动多少位。而第i个字符的next值时由前i-1个字符组成的字符串决定的。因为,第i个字符的next值是前i-1个字符组成的字符串的最大的相同前缀与后缀的字符数之和,所以next[0]=-1。在匹配的过程中,模式串中的指针不会回溯,而目标串中的指针的回溯是根据第i个失配字符的next值所决定的。

  求next函数的模板

  

void get_next(char T[], int next[])
 {
  // 求模式串T的next函数值并存入数组 next。
  j = 0; next[0] = -1; k = -1;
  while ( T[j+1] != '' ) {
  if (k = = -1 || T[j] = = T[k])
   { ++j; ++k; next[j] = k; }
  else k = next[k];
  }
 } // get_next

因为在S[i]和T[j]不等时,由于T[j]=T[k],则S[i]肯定也不等于T[k],也就是说,S[i]不应该再去和T[k]进行比较(因为纯粹是多余的),而应该直接和T[next[k]]进行比较。因此,当T[j]=T[k]时,应该直接取T[k]的next函数值作为T[j]的 next 函数值。

void get_nextval(char T[], int next[])
 {
  // 求模式串T的next函数值并存入数组 next。
  j = 0; next[0] = -1; k = -1;
  while ( T[j+1] != '' ) {
   if (k = = -1 || T[j] = = T[k]) {
    ++j; ++k;
    if (T[j]!=T[k]) next[j] = k;
    else next[j] = next[k];
   } // if
   else k = next[k];
  } // while
 } // get_nextval

  kmp比较函数

   while(i<len_a&&j<len_b)
    {
        if(j==-1||a[i]==b[j])
        {
            i++;
            j++;
        }
        else
            j=next[j];
    }

原文地址:https://www.cnblogs.com/hbutACMER/p/3872384.html