KMP算法之1974年

一、随笔

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(杨立昆),以表彰他们为当前人工智能的繁荣发展所奠定的基础。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值