扩展KMP

21 篇文章 0 订阅
2 篇文章 0 订阅
算是KMP的一种扩展吧,a是模板串,b是子串,expand[i]代表a[i..len(a)]与b的最长公共前缀
既然是它的扩展,那么思想肯定差不多~
设next[i]代表b[1..k]=b[i..i+k-1]中k的最大值//其实就是b串对自身的匹配~
而我已经求出了expand[1..k-1],现在我要求expand[k];
设我之前在匹配过程中最远匹配到了p,//即expand[i]+i-1(i in [1..k-1])中的最大值
设取到这个p的是a
即expand[a]+a-1=p;
那么设next[k-a+1]=L
如果L+K<P那么next[k]=next[k-a+1]//至于具体为什么。。那篇讲稿上有。。
否则从P开始不断的向前找,直到失配
这就是B串和B串的匹配过程
A串和B串的匹配过程一样,,所以就不说了;
Code://貌似自己之前还没写过呢
procedure expandKMP;
begin
	j:=0;
	while b[j+1]=b[j+2] do inc(j);
	next[1]:=lenb; next[2]:=j; k:=2;
	for i:=3 to lenb do
	begin
		p:=k+next[k]-1; L:=next[i-k+1];
		if L<p-i+1 then next[i]:=L
				   else begin
							j:=max(0,p-i+1);
							while (b[i+j]=b[1+j]) and (i+J<=lenb) do inc(j);
							next[i]:=j;
							k:=i;
						end;
	end;
	j:=0;
	while (a[j+1]=b[j+1]) and (j+1<=lenb) and (j+1<=lena) do inc(j);
	expand[1]:=j; k:=1;
	for i:=2 to lena do
	begin
		p:=k+expand[k]-1; L:=next[i-k+1];
		if L<p-i+1 then expand[i]:=L;
				   else begin
							j:=max(0,p-i+1);
							while (a[i+j]=b[1+j]) and (1+J<=lenb) and (i+j<=lena) do inc(j);
							expand[i]:=j;
							k:=i;
						end;
	end; 


严重注意:这里的<和<=是严格区分的
if L<p-i+1 then next[i]:=L; 这里我原本认为<=会更好,通过数学推导也是正确,但实际上会有一组恰好把它卡掉的数据
即11111
 11
 这个原因就是因为虽然next[2]=1,但它实际上a[1]和b[2]开始匹配的时候会不止1,因为后面应该还有。
 这种我们只能这样,退一步以获得正确的解
所以这个代码稍微背一下吧~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值