kmp算法
来源:互联网 发布:淘宝客的 店铺推广 编辑:程序博客网 时间:2024/06/03 17:23
求模式串T的next函数值并存入数组 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
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- KMP算法
- kmp算法
- kmp算法
- KMP算法
- KMP算法
- 【(伪)并查集】HDU5326-Work
- 国际事件--用 DNS 欺骗获得一个 .int 域名的控制权
- POJ 3581-Sequence(后缀数组)
- 开源威胁情报工具和技术
- 子段求和
- kmp算法
- 将博客搬至CSDN
- 对程序注释的理解
- 深度学习Caffe平台实例——CIFAR-10数据集在caffe平台上模型训练及实例使用模型进行预测
- Qt中用QSS切分图片
- c#学习
- redis作为消息队列实现代码
- 在ListCtrl控件中插入图标
- (八)、循环结构