学习课程:算法与数据结构
章节名称:第15周 模式匹配 第3章 KMP 算法
讲师:Liuyubobobo
课程内容:
KMP(Knuth-Morris-Pratt)算法简介
在一个字符串S内查找一个词W的出现位置。一个词在不匹配时本身就包含足够的信息来确定下一个匹配可能的开始位置。
KMP正确性证明
证明方法:反证法
假设:在更早的地方可以匹配到解
我们找到了一个更长的border(黄色+绿色),与考虑的是最长的border(黄色)矛盾
计算最长的border——LPS(Lonest proper Prefix which is also Suffix)
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、对字符串的算法及其算法时间复杂度有了一次小复习
打卡截图:
易错的点
点击查看更多内容
为 TA 点赞
0 评论
共同学习,写下你的评论
暂无评论
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦