KMP

21 篇文章 0 订阅
2 篇文章 0 订阅
好了下午刚学KMP~
于是现在复习一下~
AB两串,求B串在A串中出现的次数~
其实就是一个暴力的匹配,加上记忆一下要回到哪里;
两个指针,i在A上,j在B上,表示A[I-J+1..I] 和 B[1..J]相同
设fail[j]表示在第j项匹配成功,,但下一项失败j要回去到哪一项开始
即求一个k,使s[1..k]=s[j-k+1..j] 且k最大
可以依靠原有的基础上求解
if s[fail[j-1]+1]=s[j] then fail[j]:=fail[j-1]+1;
否则呢?if s[fail[fail[j-1]]+1]=s[j] then fail[j]:=fail[fail[j-1]]+1;
为什么呢?
可以看到
由fail的定义可得,s[fail[fail[j-1]]]之前的字符串和s[j]之前相同数量的字符串是一样的
那么又相等就是原来的+1了

Code:

function KMP(a,b:string):longint;
var i,j,ans:longint;
begin
	fail[1]:=0;
	j:=0;
	ans:0;
	for i:=2 to length(b) do
	begin
		while (j>0) and (b[j+1]<>b[i]) do j:=fail[j];
		if b[j+1]=b[i] then inc(j);
		fail[i]:=j;
	end;
	j:=0;
	for i:=1 to length(a) do
	begin
		while (j>0) and (b[j+1]<>a[i]) do j:=fail[j];
		if b[j+1]=b[i] then inc(j);
		if j=length(b) then begin
								inc(ans);
								j:=f[j];
							end;
	end;
	exit(Ans);
end;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值