为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第八天 KMP 算法

标签:
算法

学习课程:算法与数据结构

章节名称:第15周 模式匹配 第3章 KMP 算法

讲师:Liuyubobobo


课程内容:

KMP(Knuth-Morris-Pratt)算法简介

在一个字符串S内查找一个词W的出现位置。一个词在不匹配时本身就包含足够的信息来确定下一个匹配可能的开始位置。

https://img1.sycdn.imooc.com/632060a500013c8916300958.jpg

KMP正确性证明

https://img3.sycdn.imooc.com/632066050001b9d012340733.jpg

证明方法:反证法

假设:在更早的地方可以匹配到解

https://img4.sycdn.imooc.com/6320669800015b8212360734.jpg

我们找到了一个更长的border(黄色+绿色),与考虑的是最长的border(黄色)矛盾


计算最长的border——LPS(Lonest proper Prefix which is also Suffix)

https://img3.sycdn.imooc.com/632067ed000114ed12390736.jpg

lps实现(leetcode 1392. 最长快乐前缀 python3代码

class Solution:
    def longestPrefix(self, s: str) -> str:
        def getlps(x):
            lps=[0]*len(x)
            for i in range(1,len(x)):
                a=lps[i-1]
                while a>0 and x[i]!=x[a]:
                    a=lps[a-1]
                if x[i]==x[a]:
                    lps[i]=a+1
            return lps
        lps=getlps(s)
        return s[:lps[-1]]

kmp实现(Acwing 831. KMP字符串 python3代码

pn=int(input())
p=input()
sn=int(input())
s=input()
def getlps(x):
    lps=[0]*len(x)
    for i in range(1,len(x)):
        a=lps[i-1]
        while a>0 and x[i]!=x[a]:
            a=lps[a-1]
        if x[i]==x[a]:
            lps[i]=a+1
    return lps
pr=[0]+getlps(p)
i=0
j=0
while i<sn:
    if p[j]==s[i]:
        i+=1
        j+=1
    else:
        if j:
            j=pr[j]
        else:
            i+=1
    if j==pn:
        print(i-j,end=" ")
        j=pr[j]


学习收获:
1、了解并知道LPS数组
2、对KMP算法有了更深刻的认识,包括正确性的证明以及算法的递推的过程及原因,在BOBO老师的动画演示下,思路开始非常清晰,这个算法以前也学过,但是感觉了解得没有BOBO老师讲解的这么深刻,每次遇到字符串问题都是优先使用 Rabin-Karp 算法实现,下次可以多尝试用KMP,这个代码是真的短。
3、用python进行了实现,顺便解决2道算法题

4、对字符串的算法及其算法时间复杂度有了一次小复习


打卡截图:

https://img3.sycdn.imooc.com/632060710001d6e816340961.jpg

易错的点

https://img1.sycdn.imooc.com/632072840001e06d12370732.jpg




点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

0 评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消