KMP算法C++实现

KMP算法C++实现

#include "datatype.h" 
void get_next(Hstring hstring,int next[])    
{
	int i=0;
	next[0]=-1;
	int j=-1;
	while(i<hstring.length)                
	{
		if(j==-1||hstring.ch[i]==hstring.ch[j])  
		{
			++i;
			++j;
			next[i]=j;                             
		}
		else
			j=next[j];
	}
	
} 
void get_nextval(Hstring hstring,int nextval[])   //改进的nextval数组 
{
	int i=0;
	nextval[0]=-1;
	int j=-1;
	while(i<hstring.length)                
	{
		if(j==-1||hstring.ch[i]==hstring.ch[j])  
		{
			++i;
			++j;
			nextval[i]=j;  
			if(hstring.ch[i]!=hstring.ch[j])
				nextval[i]=j;
			else
				nextval[i]=nextval[j];	               
		}
		else
			j=nextval[j];
	}
}

int  KMP(Hstring hstring1,Hstring hstring2,int next[])   //kmp算法的实现  这里是求模式串再主串第pos个字符后的位置 
{
	int i=0;
	int j=-1;
	while(i<hstring1.length-1&&j<hstring2.length-1)
	{
		
		if(j==-1||hstring1.ch[i]==hstring2.ch[j])
		{
			i++;
			j++;
		}
		else j=next[j]; 
	}
	if(j=hstring2.length-1)
		return i-hstring2.length+1;
	else 
		return 0;
 } 


int main(int argc, char** argv){
	 Hstring str1{
		{'a','b','a','a','b','c','a','c'},
		8,
	}; 
	 Hstring str2{
		{'a','b','c','a'},
		4,
	}; 
	int next[4];
	get_next(str1,next);
	int m=KMP(str1,str2,next) ;
	cout<<"匹配到的位置为:"<<m<<endl;
	return 0;
}
/* 
1.求next数组的思想:(next[i]表示模式串的第i个字符与主串发生不匹配时,模式串下次要便宜的位置) 
(1)next[1]=0;
 (2) next[j]=k等价于 :'P1P2....P(k-1)'='P(j-k+1).....P(j-1)'
 (3)求next[j+1]有两种情况:
 	<1 Pk=Pj则在模式串中: 'p1....pK'='p(j-k+1).....pj'     next[j+1]=k+1
	<2 pk!=pj则表现在模式串中 'p1.....pk'='p(j-K+1).....pj'(此时将next函数问题看成一个模式串的匹配问题,整个模式串既是主串又是模式串)  next[j+1]=next[k]+1
*/ 
#include<iostream>
using namespace std;
#define maxsize 100
typedef struct{
	char ch[100];
	int length;
}Hstring;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值