KMP模式匹配算法改进,可以直接运行

#include<stdio.h>
#include<string.h>
typedef char String;
void get_nextval(String t[], int* nextval)
{
	int i=0, j=-1,tl= strlen(t);
	nextval[0] = -1;
	while (i<tl)
	{
		if (j==-1|| t[i] ==t[j])
		{
			++i; ++j; 
			if (t[i] != t[j])
			nextval[i] = j;
			else
				nextval[i] = nextval[j];
		}
		else		
			j = nextval[j];//若字符不相同,则j值回溯			
	}
}
int index_KMP(const String *s, String t[], int pos)
{
	int i = pos;//i用于主串S当前位置下标值,若pos不为1,则从pos位置开始匹配
	int j = 0,sl = strlen(s),tl = strlen(t), nextval[20];//j用于字串T中当前位置下标值;
	get_nextval(t, nextval);
	while (i <sl&&j<tl )
	{
		if (j == -1 || s[i] == t[j])
		{									
			++i; ++j;
		}
		else	j = nextval[j];
	}
	if (j >= tl)	
	return i -tl;
	else	return 0;
}
int main()
{
	String t[] = "abab", s[] = "qqweasababreter", * p;
	int l;
	if (l=index_KMP(s, t, 0))
		printf("%s\n", p = s + l);
	else
		puts("Not found !");
}``


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值