KMP算法模板
对于以字符数组输入的字符串进行kmp算法的匹配代码:
下标从1开始(对于匹配不成功的字符串,用0进行标记)
void Get_Next(){
nxt[1]=0;
int j=0;
for(int i=2;i<=m;i++){ //m为匹配串的长度
while(j>0&&pattern[i]!=pattern[j+1]) j=nxt[j];
if(pattern[i]==pattern[j+1]) j++;
nxt[i]=j;
}
}
bool KMP(char text[],char pattern[]){
int n=strlen(text+1),m=strlen(pattern+1);
Get_Next();
int j=0;
for(int i=1;i<=n;i++){
while(j>0&&(text[i]!=pattern[j+1]||j==n)) j=nxt[j];
if(text[i]==pattern[j+1]) j++;
f[i]=j; //f数组是用来记录文本串的匹配情况
if(f[i]==m) return true;
}
return false;
}对于以string字符串输入的字符串进行kmp算法匹配的代码:
下标从0开始(对于匹配不成功的字符串,用-1进行标记)
void Get_Next(){
int j=-1;
nxt[0]=-1;
for(int i=1;i<n;i++){
while(j!=-1&&pattern[i]!=pattern[j+1]) j=nxt[j];
if(pattern[i]==pattern[j+1]) j++;
nxt[i]=j;
}
}
bool KMP(string text,string pattern){
int n=text.size(),m=pattern.size();
Get_Next();
int j=-1;
for(int i=0;i<n;i++){
while(j!=-1&&text[i]!=pattern[j+1]) j=nxt[j];
if(text[i]==pattern[j+1]) j++;
if(j==m-1) return true;
}
return false;
}
