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; }