KMP算法(部分重要代码)

重要代码呈现,剩下的还需自行理解编写运行    @—@    欢迎讨论~大笑


typedef char *String;

//i表后缀,j表前缀 ,前缀是固定的,后缀是相对的 
 
//获得 next数组的内容,T 是模式匹配版 
void get_next( String T,int *next)
{
	j=0;
	i=1;
	next[i]=0;
	while(i<t[0]) //t[0]处存放的是数组的长度 
	{
		if (j==0 || t[i]==t[j]) //如果匹配 
		{
			i++;
			j++;
			if(t[i]!=t[j])
		      next[i]=j; //普通情况 
		    else
		      next[i]=next[j];//特殊情况  
		      //eg:S数组: 8 a a a a b c d e
		        // T数组: 5 a a a a a x
		}
		else
		{
			j=next[j];//j回溯 这个是关键;如果实在是不理解可以尝试着多试几组数据 
		} 
	} 
}
	
//返回子串 T 在主串 S 第 POS 个字符之后的位置
//若不存在,则返回0
int Index_KMP(String S,String t,int pos)
{
	int i=pos;
	int j=1;
	int next[255];
	
	get_next(T,&next);
	
	while(i<=S[0]  && j<=t[0])
	{
		if( 0==j || s[i]==t[j] )
		{
			i++;
			j++;
		}
		else
		{
			j=next[j];
		}
	}
	if(j>t[0])
	{
		return i-t[0];
	}
	else
	{
		return 0;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值