1.啥是KMP算法?
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。(源自百度百科)
2.代码
#include<bits/stdc++.h> using namespace std; int nxt[1005]; void GetNext(string p) { int pLen=p.length(); nxt[0]=-1; int k=-1; int j=0; while (j<pLen-1) { if(k==-1||p[j]==p[k]) { ++k; ++j; nxt[j] = k; } else k=nxt[k]; } } int KMP1(string s,string p)//返回位置 { int i=0,j=0,sLen=s.length(),pLen=p.length(); GetNext(p); while(i<sLen&&j<pLen) { if(j==-1||s[i]==p[j]) { i++; j++; } else j=nxt[j]; } if(j==pLen) return i-j; else return -1; } int KMP2(string s,string p)//返回数量 { int i=0,j=0,sLen=s.length(),pLen=p.length(),ans=0; GetNext(p); while(i<sLen&&j<pLen) { if(j==-1||s[i]==p[j]) { i++; j++; } else j=nxt[j]; if(j==pLen) { ans++; j=nxt[j-1]; i--; } } return ans; } int main() { string p,s;//p为文本串,s为模式串 cin>>p>>s; cout<<KMP1(p,s)<<endl<<KMP2(p,s); return 0; }