字符串之KMP

字符串操作是面试中经常让被面试者在纸上写的程序,串的匹配更是很多问题的抽象,解决这个问题很适当的方法就是KMP算法,该算法出现在大多数数据结构的教材上,可见其基础性与重要性。本文列举其代码,进行简单阐述。

笔者认为该算法的特点是:主要思想相对于其具体实现更加通俗。其主要思想就是匹配阶段,如何避免主串的指针回移,方法就是根据匹配串的重复特点,选择匹配串上的特定字符与当前主串指针指向的字符进行比较。

其实现阶段涉及到哨兵元素next[0]=-1,使代码变得更加简洁,但是更不好理解。笔者建议理解next的含义可以从调用其的用途出发。即,which is the next one to compare

#define PL 200
#define SL 200
int next[PL];
char S[SL];
char P[PL];
void get_next()
{
	int i=0;	//前指针
	int j=1;	//后指针
	next[0]=-1;	//P[0]之前没有元素 也可理解为哨兵
	next[1]=0;	//
	while(j<PL)
	{
		if(i==-1||P[i]==P[j])			
		{
			i++;
			j++;
			next[j]=i;			
		}
		else
		{
			i=next[i];
		}
	}
}

int KMP()
{
	int i=0;
	int j=0;
	get_next();
		while(i<SL&&j<PL)
		{
				if(j==-1||S[i]==P[j])			//j==-1 哨兵
				{
			i++;
			j++;
		}
				else
				{
						j=next[j];				//S[i]与P[j]比较不相等之后,比较S[i]与P[next[j]],所以P[j]!=P[next[j]],且P[j-1]==P[next[j]-1]
				}
		}
		if(PL-1==j)
		{
			return i-PL;		//start position
		}
		else return -1;
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值