KMP算法

KMP算法

设有两个串s和t,在串s中找到一个与t相等的子串。通常把s称为目标串,把t称为模式串。在目标串s中找到了一个模式串t则模式串匹配成功,没有找到则匹配不成功。
设n为串s的长度,m为串t的长度。

为什么要使用KMP算法?

模式匹配串是一个比较复杂的串操作,用暴力的方法来做的话,复杂度为O(m*n),但如果使用KMP算法,复杂度为O(m+n),大大提高了算法效率。
从模式串t中提取出加速匹配的有用信息,使每一次匹配不需要重头开始,而是回溯。
为了取得模式串 t中每个位置的信息,我们采用next数组表示,即next[j]=MAX{k}。(j为位置信息,k<j,模式串t中开头的k个字符依次与t[j]前面k个字符相同,取k的最大值)

next表

void GetNext(SqString t,int next[]//由模式串t求出next数组
{
	int j,k;	//j扫描t,k记录t【j】之前与t开头相同的字符个数
	j=0;k=-1;
	next[0]=-1;			//设置next[0]的值
	while(j<t.length-1)
	{
		if(k==-1||t.data[j]==t.data[k])//k为-1或者比较的字符相同时
		{
			j++;k++;//j,k依次移动到下一个字符
			next[j]=k;//设置next[j]=k
		}
		else
			k=next[k];//k回退
	}

例如模式串"abcabaa"

jt[j]next[j]
0a-1
1b0
2c0
3a0
4b1
5a2
6a1

KMP算法

以此为例
在这里插入图片描述
next表为

jt[j]next[j]
0a-1
1a0
2a1
3b2

第一次匹配从i=0,j=0,开始,失配处为i=3,j=3;
next[3]=2,则下一步为i=3,j=2;
在这里插入图片描述
匹配完成
对应的KMP算法如下

int KMPIndex(SqString s,SqString t)
{
	int next[MaxSize],i=0,j=0;
	GetNext(t,next);
	while(i<s.length&&j<t.length)
	{
		if(j==-1||s.data[i]==t.data[j])
		i++;j++;
		else
		j=next[j];
	}
	if(j>=t.length)				//匹配成功
		return(i-t.length)		//返回字符串位置
	else						//匹配不成功
	 	return -1;				//返回-1
}

对于KMP算法的话,如果还不怎么懂,多看一些例子比较好,看得多了就有那种感觉了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值