kmp算法模板
Posted myrtle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kmp算法模板相关的知识,希望对你有一定的参考价值。
目的:在字符串T中查找字符串P的出现位置,预处理P字符串得到fail数组
时间复杂度:O(|P|+|T|)
自用模板:
#include <iostream> #include <string.h> using namespace std; int Next[1110]; void get_Next(char *p) int m=strlen(p); Next[0]=Next[1]=0; for(int i=1;i<m;i++) int j=Next[i]; while(j&&p[i]!=p[j]) j=Next[j]; Next[i+1]=p[i]==p[j]?j+1:0; int kmp(char *T,char *s) int n=strlen(T),m=strlen(s); get_Next(s); int j=0; for(int i=0;i<n;i++) while(j&&T[i]!=s[j]) j=Next[j]; if(s[j]==T[i]) j++; if(j==m) return i-m+1; return -1; int main() char s[1100],T[1100]; cin>>T>>s; cout<<kmp(T,s)<<endl; //在T中找s return 0;
修改模板(在字符串T中查找P的出现次数):
int kmp(char *T,char *s) int n=strlen(T),m=strlen(s),ans=0; get_Next(s); int j=0; for(int i=0;i<n;i++) while(j&&T[i]!=s[j]) j=Next[j]; if(s[j]==T[i]) j++; if(j==m) ans++; j=Next[j]; return ans;
以上是关于kmp算法模板的主要内容,如果未能解决你的问题,请参考以下文章