最简单的算法就不说了,KMP,时间复杂度是 O(n+m)。
1.next数组
2.kmp过程
这一段和next数组的构建很相似。
#include<iostream>
#include<cstring>
using namespace std;
int next[105];
void next_int(string t){
int lent=t.length();
int j=1,i=0;
while(j<lent)
(t[i]==t[j])?(next[j+1]=++i,j++):((i==0)?(next[++j]=0):i=next[i]);
// for(int i=0;i<lent;i++){
// cout<<next[i];
// }
}
int kmp(string s,string t){
int lens=s.length(),lent=t.length();
int j=0,i=0;
while(j<lens){
(t[i]==s[j])?(i++,j++):((i==0)?(j++):i=next[i]);
if(i==lent) return j-lent+1;
}
}
int main(){
string s,t;
cin>>s>>t;
next_int(t);
int i=kmp(s,t);
cout<<i<<endl;
return 0;
}
例题 :
传送门 POJ-3461
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int next[100005];
void next_int(string t)
{
int lent=t.length();
int j=1,i=0;
while(j<lent)
(t[i]==t[j])?(next[j+1]=++i,j++):((i==0)?(next[++j]=0):i=next[i]);
// for(int i=0;i<lent;i++){
// cout<<next[i];
// }
}
int kmp(string s,string t)
{
int cnt=0;
int lens=s.length(),lent=t.length();
int j=0,i=0;
while(j<lens)
{
(t[i]==s[j])?(i++,j++):((i==0)?(j++):i=next[i]);
if(i==lent){
cnt++,i=next[i];
}
}
return cnt;
}
int main()
{
int n;
cin>>n;
while(n--)
{
string s,t;
cin>>t>>s;
next_int(t);
int i=0;
i=kmp(s,t);
cout<<i<<endl;
}
return 0;
}