#include<iostream>
using namespace std;
//暴力bf解法
int bf(string s,string t,int pos){
int i=pos;
int j=0;
int slen=s.size();
int tlen=t.size();
while(i<slen&&j<tlen){
if(s[i]==t[j]){//相等则继续判断
i++;
j++;
}
else{//不相等则ij回溯
i=i-j+1;
j=0;
}
}
if(j==tlen){
return i-tlen;
}
else{
return 0;
}
}
//kmp
void getnext(string t,int next[]){
int i=0;int j=-1;
int tlen=t.size();
next[0]=-1;
while(i<tlen){
if(j==-1||t[i]==t[j]){//回溯
i++;
j++;
next[i]=j;
}
else{
j=next[j];//回溯
}
}
}
void getnext2(string t,int next[]){
int i=0;int j=-1;
int tlen=t.size();
next[0]=-1;
while(i<tlen){
if(j==-1||t[i]==t[j]){
i++;
j++;
if (t[i] != t[j]) next[i] = j;//减少次数
else next[i] = next[j];
}
else{
j=next[j];
}
}
}
int kmp(string s,string t,int pos){
int i=pos;int next[255];
getnext2(t,next);
int j=0;
int slen=s.size();
int tlen=t.size();
while(i<slen&&j<tlen){
if(s[i]==t[j]||j==-1){
i++;
j++;
}
else{
j=next[j];
}
}
if(j==tlen){
return i-tlen;
}
else{
return 0;
}
}
int main(){
string a="0121232";
string b="2123";
int next[10];
getnext(b,next);
for(int i=0;i<=5;i++)
cout<<next[i]<<endl;
cout<<kmp(a,b,0);
return 0;
}
字符串匹配算法
最新推荐文章于 2024-10-02 22:45:05 发布