KMP算法python实现

关于KMP里面next数组的算法貌似有多种解法:
1、规定任何一个串,next[1]=0(第一个的意思),next[j]就是第j个元素前j-1个元素首尾重合部分个数加一;详见
2、下面代码实现的,next[j]为以当前字符结尾的字符串的最长前后缀匹配长度。详见

#求next数组
def same_start_end(s):
	n=len(s)
	j=0  #前缀匹配指向
	i=1  #后缀匹配指向
	res=[0 for _ in range(n)]
	while i<n:
		if s[j]!=s[i] and j==0:  #比较不相等并且此时比较的已经是第一个字符了
			res[i]=0
			i+=1
		#比较不相等,将j值设置为j前一位的res中的值,为了在之前匹配到的子串中找到最长相同前后缀
		elif s[j]!=s[i] and j!=0:
			j=res[j-1]
		elif s[j]==s[i]:
			res[i]=j+1
			j+=1
			i+=1
	return res
s='abaabcac'
print(same_start_end(s))
[0, 0, 1, 1, 2, 0, 1, 0]
s='aabbcc'  #目标串
p='ab'      #模式串
def kmp(s,p):
	size_s=len(s)
	size_p=len(p)
	i=0
	j=0
	next=same_start_end(p)
	while i<size_s:
		if s[i]==p[j]:
			i+=1
			j+=1
			if j>=size_p:
				return i-size_p  #返回匹配到的第一个字符串的第一个字符的索引
		elif s[i]!=p[j]:
			if j==0:
				i+=1
			else:
				j=next[j]
	if i==size_s:
		return -1
print(kmp(s,p))
1

————————————————
积硅步,以致千里

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值