一、随笔
next前缀表,模式串,文本串中重复子串问题,除了利用find和index内置库方法,最应该理解的一个基础知识,特此记录下
二、KMP
KMP算法的全称为Knuth(唐纳德·克努斯,1938年生,31岁起,他开始出版《计算机程序设计的艺术》这一历史性经典巨著,并因此荣获1974年度的图灵奖)-Morris(詹姆斯·莫里斯)-Pratt(沃恩·普拉特)字符串查找算法,是可以在文本串s中快速查找模式串p的一种算法。该算法由Knuth和Pratt在1974年构思,同年Morris也独立地设计出该算法,最终由三人(都是美国人)于1977年联合发表。
沾个程序代码吧,不然都是文字,太无聊了
class Solution:
'''给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
'''
def repeatedSubstringPattern(self, s: str) -> bool:
# n = len(s)
# if n <= 1:
# return False
# ss = s[1:] + s[:-1]
# print(ss.find(s),ss)
# return ss.find(s) != -1
if len(s) == 0:
return False # 第一步排除空值
nxt = [0] * len(s) # 第二步,初始化nxt数组前缀表
nxt = self.getNext(nxt, s) # 2.1 更新模式串(子串重复,模式串和文本串是一回事)前缀表
if nxt[-1]!=-1 and len(s) %(len(s)-(nxt[-1]+1)) == 0: # 第3步,判断重复条件
return True # 3.1 返回重复确认值
return False
def getNext(self,nxt, s):
j = -1
nxt[0] = -1 # 1、初始化第一个值,也就是开头只的前缀值
for i in range(1,len(s)): #1.1 、遍历应该从第二个值开始
while j >=0 and s[i] != s[j+1]: # 第二步:上一个相等,判断当前和模式串第二个
j = nxt[j] # 2.1 不同就均归负一,归初始化,重新等待计算,因为开头值永远是重复子串第一个
if s[i] == s[j+1]: # 第3步:因为j为-1,所以i索引对应的值永远要和j+1索引对应的模式串相等
j+=1 # 3.1 叠加1赋值更新j
nxt[i] = j #3.2 更新每个前缀表的-1值
return nxt # 可省略,因为next是数组,可变,为了保险用返回值,避免返回值赋值给next,避免清空
三、中国1974
前面刚说了1973年in的那点哈希函数的事
说1974年,新的一年那么KMP算法就产生了,虽说是1977年联合发表的,但是1974年就有了,咱就说1974年的事。
这一年,除了开始对秦兵马俑开始挖掘,就是“长征一号”核潜艇最有历史纪念意义了。
1974年8月1日,中央军委发布命令将中国自行设计制造的第一艘核潜艇命名为“长征一号”,正式编入海军战斗序列,标志着人民海军进入拥有核潜艇的新阶段。
四、总结
汪洋大海中的核潜艇,就像一个模式串一样,扎入了海洋这个文本串中,横移前进就像指针,探索着无人详尽的字符串。
仔细看了下三人的生卒,发现了knuth还是1974年的图灵奖得主,真了不起,另两个人就不太清楚了。
Knuth,镇神图,敬上!!!
而说道图灵奖,不得不说2018年的三个图灵奖得主。
2019年3月27日,美国计算机协会(ACM)宣布把2018年的图灵奖(Turing Award)颁给人工智能科学家Yoshua Bengio(约书亚·本吉奥),Geoffrey Hinton(杰弗里·辛顿)和Yann LeCun(杨立昆),以表彰他们为当前人工智能的繁荣发展所奠定的基础。