BF、KMP、改进后的KMP算法输出计较次数

#include<iostream>
#include<string.h>
using namespace std;
typedef struct 
{
	char ch[50];
	int length;
}SString;
int Index_BF(SString S,SString T,int pos)
{
	int i=pos-1;
	int j=0;
	int n=0;
	while(i<S.length&&j<T.length)
	{
	        if(S.ch[i]==T.ch[j])
	        {
	        	i++;
	        	j++;
	        }else 
	        {
	        	i=i-j+1;
	        	j=0;
	        }
	        n++;
	}
	cout<<"BF一共比较了"<<n<<"次"<<endl; 
	if(j>=T.length) return i-T.length+1;
	else return 0;
}
void get_next(SString T,int next[])
{
	 int i=0;
	 next[0]=-1;
	 int j=-1;
	 while(i<T.length)
	 {
	 	if(j==-1||T.ch[i]==T.ch[j])
	 	{
	 		++i;
	 		++j;
	 		next[i]=j;
	 	}
	 	else 
		{
			j=next[j];
	 	}
	 } 
}
int Index_KMP1(SString S,SString T,int pos)
{
	int i=pos-1;
	int j=0;
	int n=0;
	int next[20];
	get_next(T,next);
	while(i<S.length&&j<T.length)
	{
		if(j==-1||S.ch[i]==T.ch[j])
		{
			i++;
			j++;
		}
		else 
		{
		   j=next[j];
		}
		n++;
	}
	cout<<"KMP一共比较了"<<n<<"次"<<endl; 
	if(j>=T.length) return i-T.length+1;
	else return 0;
}
void get_nextval(SString T,int nextval[])
{
	int i=0;
	nextval[0]=-1;
	int j=-1;
	while(i<T.length) 
	{
		if(j==-1||T.ch[i]==T.ch[j])
	  {
		i++;
		j++;
		  if(T.ch[i]!=T.ch[j]) nextval[i]=j;
		  else nextval[i]=nextval[j]; 
	  }
	  else j=nextval[j];
    }
}
int Index_KMP2(SString S,SString T,int pos)
{
	int i=pos-1;
	int j=0;
	int n=0;
	int nextval[20];
	get_nextval(S,nextval);
	while(i<S.length&&j<T.length)
	{
		if(j==-1||S.ch[i]==T.ch[j])
		{
			i++;
			j++;
			n++;
		}
		else 
		{
		  if(j!=-1) n++;
		   j=nextval[j];
		}
	}
	cout<<"改进KMP一共比较了"<<n<<"次"<<endl; 
	if(j>=T.length) return i-T.length+1;
	else return 0;
}

int main()
{
	SString S,T;
	int pos,BF,KMP1,KMP2;
	cout<<"请输入主串:"<<endl;
	cin>>S.ch;
	cout<<"请输入子串:"<<endl;
	cin>>T.ch;
	cout<<"请输入要从主串的第几个位置开始匹配:"<<endl;
	cin>>pos;
	S.length=strlen(S.ch);
	T.length=strlen(T.ch);
	BF=Index_BF(S,T,pos);
	KMP1=Index_KMP1(S,T,pos);
	KMP2=Index_KMP2(S,T,pos);
	cout<<"BF子串位置:"<<BF<<endl;
	cout<<"KMP子串位置:"<<KMP1<<endl; 
	cout<<"改进KMP子串位置:"<<KMP2<<endl; 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值