首页 > 代码库 > kmp算法
kmp算法
KMP的精髓就在于,用了一个线性的算法,得到了每次在pattern[ j ]发生失配时,应该让pattern往后移动多少步,这个值对应于pattern [0, j - 1]的最长相等{前缀、后缀}的长度。这些值所存的数组叫做next数组。
关键是在于了解next数组的构成。
对于我自个儿来说,看一下下面这个求next的小例子就可以知道是怎样做了。
pattern: ABCDABD
next[]: 0,0,0,0,1,2,0
代码如下:
#include<iostream> using namespace std; #include<string> void nextFun(char* str, int* next) { next[0] = 0; int k = 0; int len = strlen(str); for (int i = 1; i < len; i++) { while (k > 0 && str[k] != str[i]) k = next[k - 1]; if (str[i] == str[k]) { k++; } next[i] = k; } } int KMP(char* str, char* pattern, int* next) { int res = 0; int len = strlen(str), lenPat = strlen(pattern); int k = 0; for (int i = 0; i < len; i++) { while (k > 0 && str[i] != pattern[k]) k = next[k - 1]; if (str[i] == pattern[k]) k++; if (k == lenPat) { res++; cout << "the matching pattern is shifting "<<i-lenPat+1<<endl; k = next[k-1]; } } return res; }
kmp算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。