KMP
用于在文本串中查找模式串是否出现或其出现次数。
在匹配过程中,一旦遇到不匹配,不改变i,而是改变j去匹配。
这就要求,要对模式串进行事先的处理。
get_Next函数
void get_Next(char* s,int* Next)
{
int m=strlen(s);
Next[0]=0;
Next[1]=0; //前k(1)位和开头k(1)位是同一位emmm不考虑这样子
for(int i=1;i<m;++i){ //注意是从1开始
//从1开始每次得到的是当前i后一位i+1的,判断是i及其之前位的匹配情况
int j=Next[i]; //此i位的Next[i]是已经求得的
while(j&&s[i]!=s[j]) j=Next[j];
//这个地方没能匹配啊,之前是j(不包括j)前(j)位与i(不包括i)前(j)位匹配
//那就再往之前能够匹配的去进行匹配,直到到0都没有匹配上或是在某一位匹配成功
if(s[i]==s[j]) Next[i+1]=j+1;
//如果匹配上(即使到0(主要是为了考虑这种情况)),得到下一位的Next[i+1]
else Next[i+1]=0; //没匹配上哦
}
}
匹配查找过程与得到Next数组很相似,要用心感受hiahiahia
Find函数
void Find(char* ss,char* s,int* Next)
{
int n=strlen(ss),m=strlen(s);
get_Next(s,Next);
int j=0; //模式串s初始当前位0
for(int i=0;i<n;++i){
while(j&&s[j]!=ss[i]) j=Next[j]; //当前不匹配且j不为0
if(s[j]==ss[i]) ++j;
//当前位匹配上了,匹配下一位;位匹配上不需再写,下一位继续匹配j(0)位
if(j==m){ //模式串s匹配完全,根据题意写计数之类的
;
}
}
}