这个算法是字符串匹配算法中的佼佼者,仅利用O(lengthText + lengthPattern)的时间就完成了匹配任务。他快速的原因是无须回溯。这个算法最高深的也是最难懂的地方在于,两个串进行匹配,成功与否竟然只和模板串有关系,和目标串是没有关系的。当模板串在j位置匹配失败后,不用重新到0位置,下一次的位置应该再next[j]的位置。
下面是生成next数组的函数:
void GetNext(string Pattern, vector<int> &next) { int j = 0; int k = -1; int lenP = Pattern.length(); next.assign(8, -1); while (j < lenP) { if ((k == -1) || (Pattern[j] == Pattern[k])) { j++; k++; next[j] = k; } else { k = next[k]; } } }下面是KMP算法:
int KMP(string Text, string Pattern, vector<int> &next, int TdefPos = 0) { int posP = 0, posT = TdefPos; int lenP = Pattern.length(); int lenT = Text.length(); while ((posP < lenP) && (posT < lenT)) { if ((posP == -1) || Pattern[posP] == Text[posT]) { posP++; posT++; } else { posP = next[posP]; } } if (posP < lenP) { return -1; } else { return (lenT - lenP); } }
作者:ZLhy_ 发表于2013-3-14 0:02:49 原文链接
阅读:149 评论:0 查看评论