kmp算法

来源:互联网 发布:淘宝客的 店铺推广 编辑:程序博客网 时间:2024/06/03 17:23

求模式串Tnext函数值并存入数组 next

void get_next(const char *T, int next[]) {  j = 0; next[0] = -1; k = -1;  while ( T[j+1] != '\0' ) {  if (k = = -1 || T[j] = = T[k])   { ++j; ++k; next[j] = k; }  else k = next[k];  } } // get_next

原作者写的太精妙,但是如果代码只能靠着举一个例子带进去求出每一步的步骤才能理解总觉得不到位。

所以我细化了每个分支选项,作如下理解:

void get_nextval(const char *T, int next[]){int j = 0, k = -1;next[0] = -1;while (1){if (T[j + 1] == '\0'){break;}if (k == -1 && T[j+1] != T[k+1])//1.所求next的位置和第一位不相等{++j;next[j] = 0;//next[j] = k = 0;}else if (k == -1 && T[j+1] == T[k+1])//2.所求next的位置和第一位相等{++j;next[j] = -1;//next[j] = next[k] = next[0] = -1;}else if (T[j] == T[k] && T[j+1] != T[k+1])//3.延续2和4中T[j] == T[k]的情况,因为前一个值相同,所以继续往后比较,此时T[++j] != T[++k]{++j; ++k;next[j] = k;}else if (T[j] == T[k] && T[j+1] == T[k+1])//4.延续2和4中T[j] == T[k]的情况,此时T[++j] == T[++k]{++j; ++k;next[j] = next[k];}else//即if(T[j] != T[k]),延续1和3中T[j] != T[k]的情况,个人认为这里不过是通过不断循环取值使k = -1从而进去上面的if中去,即将k重新指向开头,和j指向的位置开始比较{k = next[k];//k = -1;}}// while}// get_nextval 

其余要点参见:http://www.cppblog.com/oosky/archive/2006/07/06/9486.html



0 0