KMP算法的优势: 充分利用模式串自生的信息, 避免主串回溯.
KMP算法中,模式串的每一个字符都有相应的next值. next值, 其实就是失配后, 接下来使用模式串的next[j]处的字符来比对,而不是从模式串的开始字符.
两个变量,一个指向当前要计算next的字符,即指针k; 一个value值,我的理解就是位置.
如果有覆盖的话,value的值其实是向前推进的,而如果没有覆盖,它会往前回溯到前一个可能发生或延续覆盖的地方.
当value为-1时,则 i++ , 主串后移一位,模式串从头开始,新一轮匹配.
#include <IOSTREAM>
#include <STRING>
using namespace std;
void get_next (string T, int *nextValue){
int length = T.length();
int k = 1 ;
int value = -1;
//nextValue[0] = -1
nextValue[0] = value;
while(k < length){
if (value == -1 || T[k] == T[value])
{
k++;
value++;
nextValue[k] = value;
}else{
value = nextValue[value];
}
}
}
int main(){
int next[20]={0};
string s = "ababaaaba";
get_next(s,next);
for (int i=0;i<s.length();i++)
{
cout<<next[i]<<endl;
}
return 0;
}
理解记忆,有点乱.