暴力解法
#include<bits/stdc++.h>
#include<algorithm>
#define N 1000
using namespace std;
int main()
{
string a,b;
cin>>a;
cin>>b;
int j=0;
for(int i=0;i<a.length();i++)
{
if(b[j]==a[i])
{
int k=i;
while(j<b.length())
{
if(b[j]!=a[k])
{
j=0;
break;
}
else{
j++;
k++;
}
}
}
if(j==b.length())break;
}
if(j==b.length())cout<<"yes";
else cout<<"no";
return 0;
}
朴素的模式匹配算法
#include<bits/stdc++.h>
#include<algorithm>
#define N 1000
using namespace std;
string s,t;
int index(string s,string t){
int i=0;
int j=0;
while(i<s.size()&&j<t.size()){
if(s[i]==t[j]){
++i;
++j;
}
else{
i-=j-1;
j=0;
}
}
if(j==t.size())return i-t.size();
else return 0;
}
int main()
{
cin>>s;
cin>>t;
cout<<index(s,t)<<endl;
return 0;
}
KMP模式匹配算法
#include<bits/stdc++.h>
#include<algorithm>
#define N 1000
using namespace std;
string s,t;
int Get_next(string t,int *next){
int i,j;
i=1;
j=0;
next[1]=0;
while(i<t.size()){
if(j==0||t[i]==t[j]){
++i;
++j;
next[i]=j;
}
else j=next[j];
}
}
int index(string s,string t){
int i=0;
int j=0;
int next[N];
Get_next(t,next);
while(i<s.size()&&j<t.size()){
if(j==0||s[i]==t[j]){
++i;
++j;
}
else{
j=next[j];
}
}
if(j==t.size())return i-t.size();
else return 0;
}
int main()
{
cin>>s;
cin>>t;
cout<<index(s,t)<<endl;
return 0;
}
KMP模式匹配算法的优化
#include<bits/stdc++.h>
#include<algorithm>
#define N 1000
using namespace std;
string s,t;
int Get_nextval(string t,int *nextval){
int i,j;
i=1;
j=0;
nextval[1]=0;
while(i<t.size()){
if(j==0||t[i]==t[j]){
++i;
++j;
if(t[i]!=t[j])nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
int index(string s,string t){
int i=0;
int j=0;
int nextval[N];
Get_nextval(t,nextval);
while(i<s.size()&&j<t.size()){
if(j==0||s[i]==t[j]){
++i;
++j;
}
else{
j=nextval[j];
}
}
if(j==t.size())return i-t.size();
else return 0;
}
int main()
{
cin>>s;
cin>>t;
cout<<index(s,t)<<endl;
return 0;
}