首页 > 代码库 > KMP再探究:next数组的妙用
KMP再探究:next数组的妙用
我们来看一道题目:hihoCoder #1015 : KMP算法
输入
第一行一个整数N,表示测试数据组数。
接下来的N*2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。
其中N<=20
输出
对于每一个测试数据,按照它们在输入中出现的顺序输出一行Ans,表示模式串在原串中出现的次数。
HA
HAHAHA
WQN
WQN
ADA
ADADADA
BABABB
BABABABABABABABABB
DAD
ADDAADAADDAAADAAD
1
3
1
0
#include<iostream>#include<string>using namespace std;int sum;//用来记录出现过这样的子串的次数int GetNext(string t,int *next);void KMPmatch(string s,string t);int main(){ string s,t;//t模式串,s原串 int n; cin>>n; while(n--){ cin>>t>>s; sum=0; KMPmatch(s,t); cout<<sum<<endl; }}int GetNext(string t,int *next){ next[0]=-1; int i=0,j=-1; while(i<t.length()-1){ if(j==-1||t[i]==t[j]){ i++; j++; next[i]=j; } else j=next[j]; }}void KMPmatch(string s,string t){ int next[100000],i=0,j=0; GetNext(t,next); while(i<s.length()){ if(j==-1||s[i]==t[j]){ i++; j++; } else j=next[j]; if(j==t.length()){ sum++; j--; i--; j=next[j];//防止漏掉,如:ADADADA,ADA出现了三次 } }}
每完整匹配一次成功后,就让j=next[j],为什么这么做,我们通过一个例子就知道。
假设有一个原串S:CABABABDBA,模式串T:ABAB,现在来寻找模式串T在原串S中出现的次数。
KMP再探究:next数组的妙用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。