实验目的:
1.掌握串的模式匹配操作。
实验要求:
1.分别使用BF和KMP算法完成串的模式匹配。
实验过程:
1.设计完成next值的计算函数;
2.设计完成修正next值的函数;
3.KMP算法代码;
4.输入子串(abbc)和主串(abbabbcad)
5.输出子串在主串中开始的位置。
实验结果:
输入:子串:abbc 主串:abbabbcad
输出:4
实验分析:
1.普通next和修正next的区别;
2.列举调试运行过程中出现的错误并分析原因。
BF+KMP算法代码:
#include<iostream>
using namespace std;
long long sum1=0,sum2=0;
int l1,l2;
void BF(string s1,string s2,long long sum1)
{
int l1=s1.size(),l2=s2.size();
int pos=-1;
for(int i=0;i<l2;i++){
for(int j=0;j<l1;j++){
sum1++;
if(s2[i+j]==s1[j]){
if(j==l1-1){
pos=i+1;
cout<<"该主串中含有该子串,并且在主串中出现该子串的第一个位置在"<<pos<<"处。"<<endl;
}
}
else break;
}
}
if(pos==-1) cout<<"该主串中不含有子串。"<<endl;
cout<<"BF算法对于该数据运行的次数为:"<<sum1<<endl;
}
int GetNext(string P, int next[],long long sum2){
sum2=0;
int L=P.size();
int i=0; // P 的下标
int j=-1;
next[0]=-1;
while(i<L-1)
{
if(j==-1||P[i]==P[j])
{
sum2++;
i++;
j++;
next[i]=j;
}
else{
j=next[j];
}
}
int flag=0;
for(int i=l1+1;i<L;i++){
if(next[i]==l1){
flag=1;
cout<<"该主串中含有该子串,出现子串的第一个位置在:"<<i-2*l1<<endl;
}
}
if(!flag)
cout<<"该主串中没有出现该子串!"<<endl;
cout<<"KMP算法对于该数据运行的次数为:"<<sum2<<endl;
}
int main(){
string s1,s2;
int next[10010];
cout<<"请输入子串:";
cin>>s1;
cout<<"请输入主串:";
cin>>s2;
cout<<"BF算法的结果是:"<<endl;
BF(s1,s2,sum1);
l1=s1.size(),l2=s2.size();
s1+='#';
s1+=s2;
int L=s1.size();
cout<<"KMP的算法结果为:"<<endl;
GetNext(s1,next,sum2);
return 0;
}